home *** CD-ROM | disk | FTP | other *** search
/ Hottest 6 / Hottest 6 (1996)(PDSoft)[!].iso / software / emulators / frodo_1.5 / src / 6569.asm < prev    next >
Assembly Source File  |  1978-11-24  |  69KB  |  3,348 lines

  1. *
  2. * 6569.asm - VIC-Emulation
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise/Periodic:
  12. *  - Die VIC-Emulation arbeitet zeilenweise. Pro (simulierter)
  13. *    C64-Rasterzeile wird vom 6510-Task die Routine Periodic6569
  14. *    aufgerufen, die eine Pixelzeile der Grafik anhand der aktuellen
  15. *    Einstellungen in den VIC-Registern aufbaut. Dadurch können
  16. *    Rastereffekte sehr gut emuliert werden.
  17. *  - Die Emulation setzt eine 8-Bit-Chunky-Bitmap voraus und schreibt
  18. *    ihre Grafikdaten direkt dort hinein
  19. *  - Bei der Darstellung über die Amiga-Chips wird direkt in eine
  20. *    Chunky-Bitmap geschrieben, die beim VIC-VBlank in das planare Format
  21. *    konvertiert wird (mit c2p4), bei EGS/Picasso werden die Grafikdaten
  22. *    für eine Zeile in einen Puffer geschrieben, der am Ende der Zeile
  23. *    in den Grafikspeicher der Karte übertragen wird
  24. *  - Für eine sauberere Darstellung verwendet die Emulation Double
  25. *    Buffering. Es wird jeweils in eine unsichtbare Bitmap gezeichnet
  26. *    und bei einem VIC-VBlank werden die Puffer gewechselt.
  27. *  - Die Farbpalette besteht aus den 16 C64-Farben, 16mal wiederholt.
  28. *    Dadurch spart man sich das Ausmaskieren der unteren 4 Bit bei den
  29. *    VIC-Farbcodes. Allerdings muß dieses bei der Chunky->Planar-
  30. *    Konvertierung für die Amiga-Chips erfolgen (der Algorithmus
  31. *    setzt voraus, daß die oberen Nibbles Null sind).
  32. *  - Die Auswahl der 5 verschiedenen Darstellungsmodi (plus 3 ungültige,
  33. *    die einen schwarzen Bildschirm erzeugen) geschieht über den
  34. *    Zeiger DisplayProc, der auf die entsprechende Routine (z.B. TextStd,
  35. *    BitMapMulti etc.) zeigt und der bei einem Schreibzugriff auf eines
  36. *    der beiden Kontrollregister CTRL1/CTRL2 neu gesetzt wird
  37. *
  38. * 6510-Zyklenzähler
  39. *  - In jeder Rasterzeile wird der Zyklenzähler für die CPU neu gesetzt,
  40. *    und zwar unterschiedlich je nachdem, ob eine Bad Line stattfand
  41. *    oder nicht
  42. *  - Für jedes dargestellte Sprite werden nochmal je 2 Zyklen abgezogen
  43. *
  44. * Bad Lines:
  45. *  - Eine Bad Line ist dann, wenn $30 <= RASTER <= $f7 und
  46. *    die unteren drei Bits von RASTER mit den unteren drei Bits von
  47. *    Reg. $11 (Y-Scroll) übereinstimmen
  48. *  - In einer Bad Line werden 40 Bytes aus Videomatrix und Farb-RAM geholt
  49. *
  50. * Rasterzähler RC/Grafikdarstellung:
  51. *  - Der RC wird in jeder Bad Line auf Null gesetzt, gleichzeitig wird
  52. *    die Darstellung der Grafik angeschaltet (DISPLAYOFF wird gelöscht)
  53. *  - Am Ende einer Rasterzeile wird der RC um 1 erhöht, es sei denn,
  54. *    er steht auf 7. In diesem Fall wird die Darstellung ausgeschaltet.
  55. *  - Ist DISPLAYOFF gesetzt, wird in der Textspalte $3fff dargestellt,
  56. *    ansonsten Text oder Bitmapgrafik
  57. *  - Deshalb wird im oberen/unteren Rahmen immer $3fff dargestellt, weil
  58. *    es dort keine Bad Lines gibt und der RC nie zurückgesetzt wird
  59. *
  60. * Videomatrixzähler VC:
  61. *  - Es gibt zwei Register, VCBASE und VCCOUNT. Zum Zugriff auf die
  62. *    Grafikdaten wird VCCOUNT benutzt.
  63. *  - Beim VBlank wird VCBASE auf Null gesetzt
  64. *  - Zu Beginn jeder Zeile wird VCCOUNT mit dem Wert aus VCBASE geladen
  65. *  - Wenn DISPLAYOFF gelöscht ist und Grafik dargestellt wird, wird
  66. *    VCCOUNT um 40 erhöht (symbolisch für die 40 Zugriffe des VIC)
  67. *  - Wenn die Darstellung abgeschaltet wird, weil RC=7 ist (am Ende
  68. *    einer Zeile) wird VCBASE mit dem Wert aus VCCOUNT geladen
  69. *
  70. * Spritedatenzähler MCx/Spritedarstellung:
  71. *  - Da die Spritedaten beim VIC am Ende einer Rasterzeile geholt werden
  72. *    und daher die Y-Positionen der Sprites eins niedriger als die
  73. *    Rasterzeilennummern sind, werden die Spritedatenzähler in der
  74. *    Emulation am Ende einer Rasterzeile gehandhabt (nachdem die Sprites
  75. *    gezeichnet wurden)
  76. *  - Wenn ein Sprite eingeschaltet ist und die Y-Koordinate gleich den
  77. *    unteren 8 Bit von RASTER ist, wird der Datenzähler auf Null gesetzt
  78. *    und die Darstellung des Sprite eingeschaltet (Bit in SPRITEON).
  79. *    Jede folgende Rasterzeile wird der Zähler um 3 erhöht, solange er
  80. *    kleiner als 60 ist. Erreicht er 60, wird die Darstellung des Sprite
  81. *    ausgeschaltet. Wenn das Sprite Y-expandiert ist, wird der Zähler nur
  82. *    in den Zeilen erhöht, in denen die unteren Bits von Y-Koordinate und
  83. *    Zeilennummer gleich sind.
  84. *  - Der Puffer GfxCollBuf wird beim Malen der Grafikdaten mit Flags
  85. *    gefüllt, ob das zugehörige Pixel ein Vorder- oder Hintergrundpixel
  86. *    ist. Dieser Puffer wird für die Sprite-Grafik-Kollisionserkennung
  87. *    und für das Zeichnen von Hintergrundsprites benutzt.
  88. *
  89. * X-Scroll>0 und 40 Spalten:
  90. *  - Wenn der X-Scroll>0 und die 40-Spalten-Darstellung eingeschaltet
  91. *    ist, hängt das, was am linken Bildrand dargestellt wird, vom
  92. *    aktuellen Grafikmodus ab
  93. *  - Im Standard-Text-, Multicolor-Text- und Multicolor-Bitmap-Modus wird
  94. *    dort die Hintergrundfarbe aus Reg.$21 dargestellt
  95. *  - Im Standard-Bitmap- und ECM-Text-Modus wird die Hintergrundfarbe
  96. *    der letzten 8 Pixel der vorherigen Zeile dargestellt
  97. *
  98. * Inkompatibilitäten:
  99. *  - Effekte, die durch die Änderung von VIC-Registern innerhalb einer
  100. *    Rasterzeile erreicht werden, können nicht emuliert werden
  101. *  - Sprite-Kollisionen werden nur innerhalb des sichtbaren Bereiches
  102. *    erkannt, Kollisionen mit $3fff werden gar nicht erkannt
  103. *  - X-expandierte Sprites mit X-Koordinaten >=$140 werden nicht angezeigt.
  104. *    Genaugenommen sollte ein Sprite nur dann unsichtbar sein, wenn die
  105. *    X-Koordinate zwischen $1f8 und $1ff liegt.
  106. *  - In den Bitmap-Darstellungen ab den Adressen $0000 und $8000 sollte
  107. *    eigentlich ab $1000/$9000 das Char-ROM sichtbar sein. Aus
  108. *    Geschwindigkeitsgründen wird in der Emulation das RAM darunter
  109. *    dargestellt. Dies sollte keine Rolle spielen, da diese Bitmap-Seiten
  110. *    aus dem genannten Grund von keinem Programm komplett verwendet werden.
  111. *  - Der IRQ wird bei jedem Schreibzugriff in das Flag-Register gelöscht.
  112. *    Das ist ein Hack für die RMW-Befehle des 6510, die zuerst den
  113. *    Originalwert schreiben.
  114. *
  115.  
  116.         MACHINE    68020
  117.  
  118.         INCLUDE    "exec/types.i"
  119.         INCLUDE    "exec/macros.i"
  120.         INCLUDE    "exec/memory.i"
  121.         INCLUDE    "exec/libraries.i"
  122.         INCLUDE    "exec/ports.i"
  123.         INCLUDE    "intuition/intuition.i"
  124.         INCLUDE    "graphics/displayinfo.i"
  125.         INCLUDE    "egs/egs.i"
  126.         INCLUDE    "cybergraphics/cybergraphics.i"
  127.         INCLUDE    "hrg/hrgsystem.i"
  128.         INCLUDE    "devices/inputevent.i"
  129.  
  130.         XREF    _SysBase    ;Main.asm
  131.         XREF    _GfxBase
  132.         XREF    _IntuitionBase
  133.         XREF    _EGSBase
  134.         XREF    _VilIntuiBase
  135.         XREF    _CyberGfxBase
  136.         XREF    _HRGSystemBase
  137.         XREF    TurboCyber
  138.  
  139.         XREF    TheRAM        ;6510.asm
  140.         XREF    TheChar
  141.         XREF    TheColor
  142.         XREF    IntIsVICIRQ
  143.         XREF    CyclesLeft
  144.         XREF    CPUTask
  145.  
  146.         XREF    CountTODs    ;6526.asm
  147.         XREF    Periodic6526
  148.         XREF    KeyPressed
  149.  
  150.         XREF    _c2p4        ;c2p4.asm
  151.         XREF    Initc2p4
  152.         XREF    Exitc2p4
  153.  
  154.         XDEF    OpenGraphics
  155.         XDEF    CloseGraphics
  156.         XDEF    AmigaToFront
  157.         XDEF    EmulToFront
  158.         XDEF    WaitForClick
  159.         XDEF    ChangedVA
  160.         XDEF    Init6569
  161.         XDEF    Exit6569
  162.         XDEF    ReadFrom6569
  163.         XDEF    WriteTo6569
  164.         XDEF    Periodic6569
  165.  
  166.         XDEF    DisplayID    ;Prefs
  167.         XDEF    ScreenType
  168.         XDEF    NormalCycles
  169.         XDEF    BadLineCycles
  170.         XDEF    Collisions
  171.         XDEF    Overscan
  172.         XDEF    SkipLatch
  173.  
  174.         SECTION    "CODE",CODE
  175.  
  176.  
  177. **
  178. ** Definitionen
  179. **
  180.  
  181. ; VIC-Register
  182. M0Y        = $01    ;Y-Position von Sprite 0
  183. M1Y        = $03    ;Y-Position von Sprite 1
  184. M2Y        = $05    ;Y-Position von Sprite 2
  185. M3Y        = $07    ;Y-Position von Sprite 3
  186. M4Y        = $09    ;Y-Position von Sprite 4
  187. M5Y        = $0b    ;Y-Position von Sprite 5
  188. M6Y        = $0d    ;Y-Position von Sprite 6
  189. M7Y        = $0f    ;Y-Position von Sprite 7
  190. MX8        = $10    ;Höchste Bits der Sprite X-Positionen
  191. CTRL1        = $11    ;Steuerreg. 1
  192. RASTER        = $12    ;Rasterzähler
  193. SPREN        = $15    ;Sprite eingeschaltet
  194. CTRL2        = $16    ;Steuerreg. 2
  195. MYE        = $17    ;Sprite Y-Expansion
  196. VBASE        = $18    ;Basisadressen
  197. IRQFLAG        = $19    ;Interruptreg.
  198. IRQMASK        = $1a
  199. MDP        = $1b    ;Sprite Priorität
  200. MMC        = $1c    ;Sprite Multicolor
  201. MXE        = $1d    ;Sprite X-Expansion
  202. CLXSPR        = $1e    ;Kollisionsreg.
  203. CLXBGR        = $1f
  204. EC        = $20    ;Rahmenfarbe
  205. B0C        = $21    ;Hintergrundfarbe
  206.  
  207. ; Zusätzliche Register
  208. DISPLAYOFF    = $2f    ;Flag: $3fff wird dargestellt
  209. IRQRASTER    = $30    ;Rasterzeile, bei der ein IRQ ausgelöst wird (Wort)
  210. XSCROLL        = $32    ;X-Scroll-Wert (Wort)
  211. YSCROLL        = $34    ;Y-Scroll-Wert (Wort)
  212. DXSTART        = $36    ;Aktuelle Werte des Randbereichs
  213. DXSTOP        = $38
  214. DYSTART        = $3a
  215. DYSTOP        = $3c
  216. RC        = $3e    ;Rasterzähler RC
  217. MATRIXBASE    = $40    ;Videomatrix-Basis (Amiga-Adresse)
  218. CHARBASE    = $44    ;Zeichengenerator-Basis (Amiga-Adresse)
  219. BITMAPBASE    = $48    ;Bitmap-Basis (Amiga-Adresse)
  220. CURRENTA5    = $4c    ;Augenblicklicher Zeiger im Bildschirmspeicher
  221.             ;Speicher für a5 zwischen Aufrufen von Periodic6569
  222. CURRENTRASTER    = $50    ;Augenblickliche Rasterzeile
  223.             ;Speicher für d7 zwischen Aufrufen von Periodic6569
  224. LASTBKGD    = $52    ;Letzte dargestellte Hintergrundfarbe
  225. SPRITEON    = $53    ;Sprite wird dargestellt, pro Sprite ein Bit
  226. BORDERON    = $54    ;Flag: Oberer/unterer Rahmen wird dargestellt
  227. IS38COL        = $55    ;Flag: 38 Spalten
  228. SCREENOFF    = $56    ;Flag: Bildschirm ist abgeschaltet, nur Rahmen darstellen
  229.             ;Bei jedem VBlank wird Bit 4 in $D011 getestet und
  230.             ; dieses Flag entsprechend gesetzt
  231. SKIPFRAME    = $57    ;Flag: Dieses Frame überspringen, nichts zeichnen
  232. MC0        = $58    ;Spritedatenzähler 0
  233. MC1        = $5a
  234. MC2        = $5c
  235. MC3        = $5e
  236. MC4        = $60
  237. MC5        = $62
  238. MC6        = $64
  239. MC7        = $66    ;Spritedatenzähler 7
  240. VCBASE        = $68    ;VC-Zwischenspeicher
  241. VCCOUNT        = $6a    ;VC-Zähler
  242. BORDERLONG    = $6c    ;Vorberechnete Farbwerte
  243. BACK0LONG    = $70
  244. SPRX0        = $74    ;16-Bit Sprite-X-Koordinaten
  245. SPRX1        = $76
  246. SPRX2        = $78
  247. SPRX3        = $7a
  248. SPRX4        = $7c
  249. SPRX5        = $7e
  250. SPRX6        = $80
  251. SPRX7        = $82
  252. VICRegLength    = $84
  253.  
  254. ; Anzahl Rasterzeilen
  255. TotalRasters    = $138
  256.  
  257. ; Textfenster-Koordinaten (Stop-Werte sind immer eins mehr)
  258. Row25YStart    = $33
  259. Row25YStop    = $fb
  260. Row24YStart    = $37
  261. Row24YStop    = $f7
  262.  
  263. Col40XStart    = $18
  264. Col40XStop    = $158
  265. Col38XStart    = $1f
  266. Col38XStop    = $14f
  267.  
  268. ; Erste und letzte mögliche Zeile für Bad Lines
  269. FirstDMALine    = $30
  270. LastDMALine    = $f7
  271.  
  272. ; Erste und letzte dargestellte Zeile
  273. FirstDispLine    = $10
  274. LastDispLine    = $11f    ;eigentlich $12b
  275.  
  276. ; Größe der Anzeige
  277. DisplayX    = $170
  278. DisplayY    = LastDispLine-FirstDispLine+1
  279.  
  280. ; ScreenTypes
  281. STYP_EGS    = 0
  282. STYP_PICASSO    = 1
  283. STYP_AMIGA    = 2
  284. STYP_AMIGAMONO    = 3
  285. STYP_CYBER    = 4
  286. STYP_MERLIN    = 5
  287.  
  288. ; EGS
  289. E_OpenScreen    = -30
  290. E_CloseScreen    = -36
  291. E_ScreenToFront    = -60
  292. E_ScreenToBack    = -66
  293. E_ActivateEGSScreen = -72
  294. E_ActivateAmigaScreen = -78
  295. E_SetRGB8    = -84
  296. E_DisposeBitMap    = -132
  297. E_FlipMap    = -168
  298. E_AllocBitMap    = -198
  299.  
  300. ; Village
  301. OpenVillageScreen = -30
  302. CloseVillageScreen = -36
  303. LockVillageScreen = -42
  304. UnLockVillageScreen = -48
  305. OpenVillageScreenTagList = -114
  306. VillageGetBufAddr = -126
  307. VillageSetDisplayBuf = -132
  308.  
  309. TAVIS_FIRSTITEM    = TAG_USER+4711
  310. TAVIS_DOUBLE_BUFFER = TAVIS_FIRSTITEM+40
  311. TAVIS_DM_STRUCT    = TAVIS_FIRSTITEM+41
  312.  
  313. ; CyberGfx
  314. IsCyberModeID    = -54
  315. GetCyberMapAttr    = -96
  316. DoCDrawMethod    = -156
  317.  
  318. ; HRG
  319. hrLockBitMap    = -78
  320. hrUnlockBitMap    = -84
  321. hrOpenScreenTagList = -90
  322. hrCloseScreen    = -96
  323. hrGetRGBA    = -108
  324. hrSetRGB8    = -114
  325. hrSwitchCursor    = -216
  326.  
  327. *
  328. * Makros
  329. *
  330.  
  331. ; Aus einer VIC-16-Bit-Adresse die entsprechende Amiga-Adresse berechnen
  332. ; -> d0.w: 16-Bit-Adresse
  333. ; <- a0.l: 32-Bit-Adresse
  334. GetPhysical    MACRO
  335.         or.w    CiaVABase(pc),d0 ;VA14/15 dazunehmen
  336.         move.w    d0,d1
  337.         and.w    #$7000,d1
  338.         cmp.w    #$1000,d1
  339.         beq    \@1$
  340.         move.l    TheRAM(pc),a0
  341.         moveq    #0,d1
  342.         move.w    d0,d1
  343.         add.l    d1,a0
  344.         bra    \@2$
  345. \@1$        and.w    #$0fff,d0    ;$1000-$1fff, $9000-$9fff: Char-ROM
  346.         move.l    TheChar(pc),a0
  347.         add.w    d0,a0
  348. \@2$
  349.         ENDM
  350.  
  351. ; Sprite darstellen
  352. DoSprite    MACRO    ;Nummer
  353.         btst    #\1,SPRITEON(a4) ;Wird das Sprite dargestellt?
  354.         beq    \@1$
  355.  
  356.         move.l    MATRIXBASE(a4),a0
  357.         moveq    #0,d0
  358.         move.b    $03f8+\1(a0),d0    ;Datenzeiger
  359.         lsl.w    #6,d0        ;*64
  360.         add.w    MC\1(a4),d0    ;MC dazunehmen
  361.         GetPhysical
  362.         move.l    (a0),d0        ;d0: Spritedaten
  363.  
  364.         move.w    SPRX\1(a4),d1    ;d1: X-Koordinate
  365.         move.l    a5,a1
  366.         add.w    d1,a1        ;a1: Ziel im Bildschirmspeicher
  367.         lea    SprCollBuf,a2
  368.         add.w    d1,a2        ;a2: Ziel im Kollisionspuffer
  369.         lea    GfxCollBuf,a3
  370.         add.w    d1,a3        ;a3: Zeiger auf Grafik-Kollisionspuffer
  371.  
  372.         move.b    $27+\1(a4),d2    ;d2: Spritefarbe
  373.  
  374.         move.b    #1<<\1,d7    ;d7: Sprite-Bit
  375.         jsr    ([Sprite\1Proc])
  376. \@1$
  377.         ENDM
  378.  
  379.  
  380. **
  381. ** Bildschirm öffnen
  382. ** Rückgabe: d0=0 Alles OK
  383. **           d0=1 Fehler beim Screen-Öffnen
  384. **           d0=2 Kein Speicher
  385. **           d0=3 Kein EGS
  386. **           d0=4 Kein VilIntuiSup
  387. **           d0=5 Probleme mit DisplayID
  388. **           d0=6 Screen zu klein (min. 384×272)
  389. **           d0=7 Kein CyberGfx
  390. **           d0=8 Kein CyberGfx-Modus ausgewählt
  391. **           d0=9 Kein HRG
  392. **
  393.  
  394. ; Name des ScreenMode holen
  395. OpenGraphics    move.l    _GfxBase,a6
  396.         sub.l    a0,a0
  397.         lea    ModeNameBuf,a1
  398.         moveq    #nif_SIZEOF,d0
  399.         move.l    #DTAG_NAME,d1
  400.         move.l    DisplayID,d2
  401.         JSRLIB    GetDisplayInfoData
  402.         tst.l    d0
  403.         beq    NoDisplayID
  404.  
  405. ; Register vorbereiten
  406.         lea    Registers,a0
  407.         move.w    #7,RC(a0)
  408.         move.w    #-1,CURRENTRASTER(a0)
  409.         move.l    TheRAM,MATRIXBASE(a0)
  410.         move.l    TheRAM,CHARBASE(a0)
  411.         move.l    TheRAM,BITMAPBASE(a0)
  412.         clr.w    CiaVABase
  413.         move.w    #63,MC0(a0)
  414.         move.w    #63,MC1(a0)
  415.         move.w    #63,MC2(a0)
  416.         move.w    #63,MC3(a0)
  417.         move.w    #63,MC4(a0)
  418.         move.w    #63,MC5(a0)
  419.         move.w    #63,MC6(a0)
  420.         move.w    #63,MC7(a0)
  421.  
  422.         bsr    SetDispProc
  423.         bsr    SetSpriteProcs
  424.  
  425. ; Screen-Typ auswerten (Amiga)
  426.         cmp.w    #STYP_AMIGA,ScreenType
  427.         beq    OpenAmiga
  428.         cmp.w    #STYP_AMIGAMONO,ScreenType
  429.         beq    OpenAmigaMono
  430.  
  431. ; EGS/Picasso/Cyber/Merlin: Dimensionen holen und prüfen, ob ausreichend
  432.         move.l    _IntuitionBase,a6
  433.         move.l    DisplayID,a0
  434.         lea    TheRect,a1
  435.         moveq    #OSCAN_TEXT,d0
  436.         JSRLIB    QueryOverscan
  437.         tst.l    d0
  438.         beq    NoDisplayID
  439.  
  440.         lea    TheRect,a0
  441.         move.w    ra_MaxX(a0),d0
  442.         sub.w    ra_MinX(a0),d0
  443.         addq.w    #1,d0
  444.         move.w    d0,ScreenX
  445.         move.w    ra_MaxY(a0),d0
  446.         sub.w    ra_MinY(a0),d0
  447.         addq.w    #1,d0
  448.         move.w    d0,ScreenY
  449.  
  450.         cmp.w    #384,ScreenX
  451.         blo    TooSmall
  452.         cmp.w    #272,ScreenY
  453.         blo    TooSmall
  454.  
  455. ; Screen-Typ auswerten (EGS/Picasso/Cyber/Merlin)
  456.         cmp.w    #STYP_EGS,ScreenType
  457.         beq    OpenEGS
  458.         cmp.w    #STYP_CYBER,ScreenType
  459.         beq    OpenCyber
  460.         cmp.w    #STYP_MERLIN,ScreenType
  461.         beq    OpenMerlin
  462.         bra    OpenPicasso
  463.  
  464. *
  465. * Amiga-Screen öffnen
  466. *
  467.  
  468. ; Screen öffnen
  469. OpenAmiga    move.w    #$180,d0        ;Vielfaches von 32 (wegen c2p)
  470.         move.w    d0,ScreenX
  471.         move.w    d0,WindowWidth+2
  472.         move.w    #DisplayY,d0
  473.         move.w    d0,ScreenY
  474.         move.w    d0,WindowHeight+2
  475.         move.l    DisplayID,ScreenDID
  476.         move.w    Overscan,ScreenOScan+2
  477.  
  478.         bsr    Initc2p4
  479.         tst.l    d0
  480.         beq    NoMem
  481.  
  482.         move.l    _IntuitionBase,a6
  483.         sub.l    a0,a0
  484.         lea    ScreenTags,a1
  485.         JSRLIB    OpenScreenTagList
  486.         move.l    d0,TheScreen
  487.         beq    NoScreen
  488.         move.l    d0,WindowScreen
  489.  
  490.         move.l    TheScreen,a0
  491.         lea    sc_RastPort(a0),a1
  492.         move.l    a1,TheRastPort
  493.         lea    sc_ViewPort(a0),a1
  494.         move.l    a1,TheViewPort
  495.  
  496. ; Speicher für Chunky-BitMap und Comparison Buffer holen
  497.         move.l    _SysBase,a6
  498.         move.w    ScreenX,d0
  499.         mulu.w    #DisplayY,d0
  500.         add.l    d0,d0
  501.         move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  502.         JSRLIB    AllocVec
  503.         move.l    d0,InvisibleMap
  504.         beq    NoMem
  505.         move.w    ScreenX,d1
  506.         mulu.w    #DisplayY,d1
  507.         add.l    d1,d0
  508.         move.l    d0,ComparisonBuf
  509.  
  510. ; Fenster öffnen
  511.         move.l    _IntuitionBase,a6
  512.         sub.l    a0,a0
  513.         lea    WindowTags,a1
  514.         JSRLIB    OpenWindowTagList
  515.         move.l    d0,TheWindow
  516.         beq    NoMem
  517.  
  518.         move.l    TheWindow,a0
  519.         move.l    wd_UserPort(a0),WindowPort
  520.  
  521. ; Farbpalette laden
  522.         move.l    _GfxBase,a6
  523.         moveq    #0,d7        ;Registerzähler
  524.         lea    Palette,a2
  525. 1$        move.b    d7,d0
  526.         and.w    #$0f,d0
  527.         lea    (a2,d0.w*4),a0
  528.         moveq    #0,d1
  529.         move.b    (a0)+,d1
  530.         lsr.b    #4,d1
  531.         moveq    #0,d2
  532.         move.b    (a0)+,d2
  533.         lsr.b    #4,d2
  534.         moveq    #0,d3
  535.         move.b    (a0)+,d3
  536.         lsr.b    #4,d3
  537.         move.l    d7,d0
  538.         move.l    TheViewPort,a0
  539.         JSRLIB    SetRGB4
  540.         addq.b    #1,d7
  541.         cmp.b    #16,d7        ;Hier nur 16 Register
  542.         bne    1$
  543.  
  544. ; VBlank-Routine setzen
  545.         move.l    #AmigaVBlank,VBlankProc
  546.  
  547. ; Double Buffering-Kram einrichten
  548. ; Bildschirmadresse neu setzen!
  549.         bsr    OpenDoubleBuf
  550.         clr.w    MustWaitForC2P
  551.  
  552.         moveq    #0,d0
  553.         rts
  554.  
  555. *
  556. * Amiga-Mono-Screen öffnen
  557. *
  558.  
  559. ; Screen öffnen
  560. OpenAmigaMono    move.w    #$180,d0
  561.         move.w    d0,ScreenX
  562.         move.w    d0,WindowWidth+2
  563.         move.w    #DisplayY,d0
  564.         move.w    d0,ScreenY
  565.         move.w    d0,WindowHeight+2
  566.         move.l    DisplayID,MonoScreenDID
  567.         move.w    Overscan,MonoScreenOScan+2
  568.  
  569.         move.l    _IntuitionBase,a6
  570.         sub.l    a0,a0
  571.         lea    MonoScreenTags,a1
  572.         JSRLIB    OpenScreenTagList
  573.         move.l    d0,TheScreen
  574.         beq    NoScreen
  575.         move.l    d0,WindowScreen
  576.  
  577.         move.l    TheScreen,a0
  578.         lea    sc_RastPort(a0),a1
  579.         move.l    a1,TheRastPort
  580.         lea    sc_ViewPort(a0),a1
  581.         move.l    a1,TheViewPort
  582.  
  583. ; Fenster öffnen
  584.         move.l    _IntuitionBase,a6
  585.         sub.l    a0,a0
  586.         lea    WindowTags,a1
  587.         JSRLIB    OpenWindowTagList
  588.         move.l    d0,TheWindow
  589.         beq    NoMem
  590.  
  591.         move.l    TheWindow,a0
  592.         move.l    wd_UserPort(a0),WindowPort
  593.  
  594. ; Farbpalette laden (schwarz/weiß)
  595.         move.l    _GfxBase,a6
  596.         move.l    TheViewPort,a0
  597.         moveq    #0,d0
  598.         moveq    #0,d1
  599.         moveq    #0,d2
  600.         moveq    #0,d3
  601.         JSRLIB    SetRGB4
  602.         move.l    TheViewPort,a0
  603.         moveq    #1,d0
  604.         moveq    #15,d1
  605.         moveq    #15,d2
  606.         moveq    #15,d3
  607.         JSRLIB    SetRGB4
  608.  
  609. ; Adresse der Bitplane setzen
  610.         move.l    TheRastPort,a0
  611.         move.l    rp_BitMap(a0),a0
  612.         move.l    bm_Planes(a0),a0
  613.         move.l    a0,InvisibleMap
  614.         move.l    a0,Registers+CURRENTA5
  615.  
  616. ; VBlank-Routine setzen
  617.         move.l    #AmigaMonoVBlank,VBlankProc
  618.  
  619. ; Double Buffering-Kram einrichten
  620.         bsr    OpenDoubleBuf
  621.  
  622.         moveq    #0,d0
  623.         rts
  624.  
  625. *
  626. * Picasso-Screen öffnen
  627. *
  628.  
  629. ; vilintuisup.library öffnen
  630. OpenPicasso    move.l    _SysBase,a6
  631.         moveq    #2,d0
  632.         lea    VilIntuiName,a1
  633.         JSRLIB    OpenLibrary
  634.         move.l    d0,_VilIntuiBase
  635.         beq    NoVilIntuiSup
  636.  
  637. ; Screen öffnen (interleaved)
  638.         move.w    ScreenX,WindowWidth+2
  639.         move.w    ScreenY,WindowHeight+2
  640.  
  641.         move.l    _VilIntuiBase,a6
  642.         lea    Dimensions,a0
  643.         move.w    ScreenX,4(a0)
  644.         move.w    ScreenY,6(a0)
  645.         lea    VilTags,a0
  646.         jsr    OpenVillageScreenTagList(a6)
  647.         move.l    d0,TheScreen
  648.         beq    NoScreen
  649.         move.l    d0,WindowScreen
  650.  
  651.         move.l    TheScreen,a0
  652.         lea    sc_ViewPort(a0),a1
  653.         move.l    a1,TheViewPort
  654.  
  655. ; Fenster öffnen
  656.         move.l    _IntuitionBase,a6
  657.         sub.l    a0,a0
  658.         lea    WindowTags,a1
  659.         JSRLIB    OpenWindowTagList
  660.         move.l    d0,TheWindow
  661.         beq    NoMem
  662.  
  663.         move.l    TheWindow,a0
  664.         move.l    wd_UserPort(a0),WindowPort
  665.  
  666. ; Farbpalette laden
  667.         move.l    _GfxBase,a6
  668.         moveq    #0,d7        ;Registerzähler
  669.         lea    Palette,a2
  670. 1$        move.b    d7,d0
  671.         and.w    #$0f,d0
  672.         lea    (a2,d0.w*4),a0
  673.         moveq    #0,d1
  674.         move.b    (a0)+,d1
  675.         moveq    #0,d2
  676.         move.b    (a0)+,d2
  677.         moveq    #0,d3
  678.         move.b    (a0)+,d3
  679.         move.l    d7,d0
  680.         move.l    TheViewPort,a0
  681.         JSRLIB    SetRGB4
  682.         addq.b    #1,d7
  683.         bne    1$
  684.  
  685. ; Adresse des Bildschirmspeichers setzen
  686.         move.l    #1,InvBufNum        ;Adresse des zweiten Puffers holen
  687.         move.l    _VilIntuiBase,a6
  688.         move.l    TheScreen,a0
  689.         jsr    LockVillageScreen(a6)
  690.         move.l    TheScreen,a0
  691.         move.l    InvBufNum,d0
  692.         jsr    VillageGetBufAddr(a6)
  693.         move.l    d0,Registers+CURRENTA5
  694.  
  695. ; VBlank-Routine setzen
  696.         move.l    #PicassoVBlank,VBlankProc
  697.  
  698.         moveq    #0,d0
  699.         rts
  700.  
  701. *
  702. * EGS-Screen öffnen
  703. *
  704.  
  705. ; egs.library öffnen
  706. OpenEGS        move.l    _SysBase,a6
  707.         moveq    #6,d0
  708.         lea    EGSName,a1
  709.         JSRLIB    OpenLibrary
  710.         move.l    d0,_EGSBase
  711.         beq    NoEGS
  712.  
  713. ; Screen öffnen
  714.         move.l    _EGSBase,a6
  715.         lea    NewEScreen,a0
  716.         jsr    E_OpenScreen(a6)
  717.         move.l    d0,TheScreen
  718.         beq    NoScreen
  719.  
  720.         move.l    TheScreen,a0
  721.         move.l    esc_Port(a0),EGSPort
  722.  
  723. ; Zweite Bitmap für Double Buffering holen
  724.         moveq    #0,d0
  725.         move.w    ScreenX,d0
  726.         moveq    #0,d1
  727.         move.w    ScreenY,d1
  728.         moveq    #8,d2
  729.         moveq    #0,d3
  730.         move.l    #E_EB_DISPLAYABLE|E_EB_CLEARMAP,d4
  731.         move.l    TheScreen,a0
  732.         move.l    esc_Map(a0),a0
  733.         jsr    E_AllocBitMap(a6)
  734.         move.l    d0,InvisibleMap
  735.         beq    NoMem
  736.  
  737. ; Farbpalette laden
  738.         moveq    #0,d7        ;Registerzähler
  739.         lea    Palette,a2
  740. 1$        move.b    d7,d0
  741.         and.w    #$0f,d0
  742.         lea    (a2,d0.w*4),a0
  743.         moveq    #0,d1
  744.         move.b    (a0)+,d1
  745.         moveq    #0,d2
  746.         move.b    (a0)+,d2
  747.         moveq    #0,d3
  748.         move.b    (a0)+,d3
  749.         move.l    d7,d0
  750.         move.l    TheScreen,a0
  751.         jsr    E_SetRGB8(a6)
  752.         addq.b    #1,d7
  753.         bne    1$
  754.  
  755. ; Adresse des Bildschirmspeichers setzen
  756.         move.l    InvisibleMap,a1
  757.         addq.b    #1,ebm_Lock(a1)
  758.         move.l    ebm_Dest(a1),Registers+CURRENTA5
  759.  
  760. ; VBlank-Routine setzen
  761.         move.l    #EGSVBlank,VBlankProc
  762.  
  763.         moveq    #0,d0
  764.         rts
  765.  
  766. *
  767. * Cybergraphics-Screen öffnen
  768. *
  769.  
  770. ; cybergraphics.library öffnen
  771. OpenCyber    tst.l    _CyberGfxBase
  772.         bne    2$
  773.         move.l    _SysBase,a6
  774.         moveq    #40,d0
  775.         lea    CyberGfxName,a1
  776.         JSRLIB    OpenLibrary
  777.         move.l    d0,_CyberGfxBase
  778.         beq    NoCyberGfx
  779. 2$
  780.  
  781. ; CyberGfx-Modus?
  782.         move.l    _CyberGfxBase,a6
  783.         move.l    DisplayID,d0
  784.         jsr    IsCyberModeID(a6)
  785.         tst.l    d0
  786.         beq    NoCyberMode
  787.  
  788. ; Screen öffnen
  789.         move.w    ScreenX,WindowWidth+2
  790.         move.w    ScreenX,CyberScreenX+2
  791.         move.w    ScreenY,WindowHeight+2
  792.         move.w    ScreenY,CyberScreenY+2
  793.         move.l    DisplayID,CyberScreenDID
  794.  
  795.         move.l    _IntuitionBase,a6
  796.         sub.l    a0,a0
  797.         lea    CyberScreenTags,a1
  798.         JSRLIB    OpenScreenTagList
  799.         move.l    d0,TheScreen
  800.         beq    NoScreen
  801.         move.l    d0,WindowScreen
  802.  
  803.         move.l    TheScreen,a0
  804.         lea    sc_RastPort(a0),a1
  805.         move.l    a1,TheRastPort
  806.         lea    sc_ViewPort(a0),a1
  807.         move.l    a1,TheViewPort
  808.  
  809. ; Fenster öffnen
  810.         move.l    _IntuitionBase,a6
  811.         sub.l    a0,a0
  812.         lea    WindowTags,a1
  813.         JSRLIB    OpenWindowTagList
  814.         move.l    d0,TheWindow
  815.         beq    NoMem
  816.  
  817.         move.l    TheWindow,a0
  818.         move.l    wd_UserPort(a0),WindowPort
  819.  
  820. ; Farbpalette laden
  821.         move.l    _GfxBase,a6
  822.         moveq    #0,d7        ;Registerzähler
  823.         lea    Palette,a2
  824. 1$        move.b    d7,d0
  825.         and.w    #$0f,d0
  826.         lea    (a2,d0.w*4),a0
  827.         move.w    (a0),d1
  828.         move.b    (a0),d1
  829.         swap    d1
  830.         move.w    (a0),d1
  831.         move.b    (a0)+,d1
  832.         move.w    (a0),d2
  833.         move.b    (a0),d2
  834.         swap    d2
  835.         move.w    (a0),d2
  836.         move.b    (a0)+,d2
  837.         move.w    (a0),d3
  838.         move.b    (a0),d3
  839.         swap    d3
  840.         move.w    (a0),d3
  841.         move.b    (a0)+,d3
  842.         move.l    d7,d0
  843.         move.l    TheViewPort,a0
  844.         JSRLIB    SetRGB32
  845.         addq.b    #1,d7
  846.         bne    1$
  847.  
  848. ; Ohne Turbo alles nach LineStore schreiben, sonst das meiste direkt
  849. ; in den Bildschirmspeicher
  850.         tst.l    TurboCyber
  851.         bne    3$
  852.         move.l    #LineStore,Registers+CURRENTA5
  853.         bra    4$
  854. 3$        move.l    _CyberGfxBase,a6
  855.         move.l    TheRastPort,a0
  856.         move.l    rp_BitMap(a0),a0
  857.         move.l    #CYBRMATTR_DISPADR,d0
  858.         jsr    GetCyberMapAttr(a6)
  859.         move.l    d0,InvisibleMap
  860.         move.l    d0,Registers+CURRENTA5
  861.  
  862. ; VBlank-Routine setzen
  863. 4$        move.l    #CyberVBlank,VBlankProc
  864.  
  865.         moveq    #0,d0
  866.         rts
  867.  
  868. *
  869. * Merlin-Screen öffnen
  870. *
  871.  
  872. ; hrgsystem.library öffnen
  873. OpenMerlin    move.l    _SysBase,a6
  874.         moveq    #38,d0
  875.         lea    HRGSystemName,a1
  876.         JSRLIB    OpenLibrary
  877.         move.l    d0,_HRGSystemBase
  878.         beq    NoHRGSystem
  879.  
  880. ; Screen öffnen
  881.         move.w    ScreenX,d0
  882.         move.w    ScreenY,d1
  883.         move.w    d0,WindowWidth+2
  884.         move.w    d1,WindowHeight+2
  885.         move.w    d0,HRGScrWidth+2
  886.         move.w    d1,HRGScrHeight+2
  887.  
  888.         move.l    _HRGSystemBase,a6
  889.         lea    HRGScreenTags,a0
  890.         jsr    hrOpenScreenTagList(a6)
  891.         move.l    d0,MerlScreen
  892.         beq    NoScreen
  893.         move.l    d0,a0
  894.         move.l    hrh_IScr(a0),a0
  895.         move.l    a0,WindowScreen
  896.         move.l    a0,TheScreen
  897.  
  898. ; Fenster öffnen
  899.         move.l    _IntuitionBase,a6
  900.         sub.l    a0,a0
  901.         lea    WindowTags,a1
  902.         JSRLIB    OpenWindowTagList
  903.         move.l    d0,TheWindow
  904.         beq    NoMem
  905.  
  906.         move.l    TheWindow,a0
  907.         move.l    wd_UserPort(a0),WindowPort
  908.  
  909. ; Farbpalette laden
  910.         move.l    _HRGSystemBase,a6
  911.         moveq    #0,d7        ;Registerzähler
  912.         lea    Palette,a2
  913. 1$        move.b    d7,d0
  914.         and.w    #$0f,d0
  915.         lea    (a2,d0.w*4),a0
  916.         moveq    #0,d1
  917.         move.b    (a0)+,d1
  918.         moveq    #0,d2
  919.         move.b    (a0)+,d2
  920.         moveq    #0,d3
  921.         move.b    (a0)+,d3
  922.         move.l    d7,d0
  923.         move.l    MerlScreen,a0
  924.         jsr    hrSetRGB8(a6)
  925.         addq.b    #1,d7
  926.         bne    1$
  927.  
  928. ; Adresse des Bildschirmspeichers setzen
  929.         move.l    MerlScreen,a0
  930.         lea    hrh_BitMap(a0),a2
  931.         move.l    a2,a0
  932.         jsr    hrLockBitMap(a6)
  933.         move.l    d0,InvisibleMap
  934.         move.l    d0,Registers+CURRENTA5
  935.         move.l    a2,a0
  936.         jsr    hrUnlockBitMap(a6)
  937.  
  938. ; VBlank-Routine setzen
  939.         move.l    #MerlinVBlank,VBlankProc
  940.  
  941.         moveq    #0,d0
  942.         rts
  943.  
  944. ; Fehler aufgetreten
  945. NoScreen    moveq    #1,d0
  946.         rts
  947. NoMem        moveq    #2,d0
  948.         rts
  949. NoEGS        moveq    #3,d0
  950.         rts
  951. NoVilIntuiSup    moveq    #4,d0
  952.         rts
  953. NoDisplayID    moveq    #5,d0
  954.         rts
  955. TooSmall    moveq    #6,d0
  956.         rts
  957. NoCyberGfx    moveq    #7,d0
  958.         rts
  959. NoCyberMode    moveq    #8,d0
  960.         rts
  961. NoHRGSystem    moveq    #9,d0
  962.         rts
  963.  
  964.  
  965. *
  966. * Double Buffering einrichten
  967. *
  968.  
  969. ; Intuition V39 vorhanden? Sonst hat's keinen Zweck.
  970. OpenDoubleBuf    move.l    _IntuitionBase,a0
  971.         cmp.w    #39,LIB_VERSION(a0)
  972.         blo    1$
  973.  
  974. ; Screen Buffer holen
  975.         move.l    _IntuitionBase,a6
  976.         move.l    TheScreen,a0
  977.         sub.l    a1,a1
  978.         moveq    #SB_SCREEN_BITMAP,d0
  979.         JSRLIB    AllocScreenBuffer
  980.         move.l    d0,ScrBuf0
  981.         beq    CloseDoubleBuf
  982.  
  983.         move.l    TheScreen,a0
  984.         sub.l    a1,a1
  985.         moveq    #SB_COPY_BITMAP,d0
  986.         JSRLIB    AllocScreenBuffer
  987.         move.l    d0,ScrBuf1
  988.         beq    CloseDoubleBuf
  989.  
  990. ; Etwas warten
  991.         move.l    _GfxBase,a6
  992.         JSRLIB    WaitTOF
  993.         JSRLIB    WaitTOF
  994.  
  995. ; Adresse des Bildschirmspeichers holen
  996.         move.l    #1,InvBufNum
  997.  
  998.         cmp.w    #STYP_AMIGA,ScreenType
  999.         beq    2$
  1000.         move.l    ScrBuf1,a0
  1001.         move.l    sb_BitMap(a0),a0
  1002.         move.l    bm_Planes(a0),Registers+CURRENTA5
  1003.         move.w    #-1,UsingDB
  1004. 1$        rts
  1005.  
  1006. ; Amiga: Zweiten Comparison Buffer holen
  1007. 2$        move.l    InvisibleMap,Registers+CURRENTA5
  1008.  
  1009.         move.l    _SysBase,a6
  1010.         move.w    ScreenX,d0
  1011.         mulu.w    #DisplayY,d0
  1012.         move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  1013.         JSRLIB    AllocVec
  1014.         move.l    d0,ComparisonBuf1
  1015.         beq    CloseDoubleBuf
  1016.  
  1017.         move.w    #-1,UsingDB
  1018.         rts
  1019.  
  1020.  
  1021. **
  1022. ** Bildschirm schließen
  1023. **
  1024.  
  1025. CloseGraphics    cmp.w    #STYP_EGS,ScreenType
  1026.         beq    CloseEGS
  1027.         cmp.w    #STYP_PICASSO,ScreenType
  1028.         beq    ClosePicasso
  1029.         cmp.w    #STYP_AMIGAMONO,ScreenType
  1030.         beq    CloseAmigaMono
  1031.         cmp.w    #STYP_CYBER,ScreenType
  1032.         beq    CloseCyber
  1033.         cmp.w    #STYP_MERLIN,ScreenType
  1034.         beq    CloseMerlin
  1035.  
  1036. ; Amiga
  1037. CloseAmiga    move.l    _IntuitionBase,a6
  1038.         move.l    TheWindow,d0
  1039.         beq    1$
  1040.         move.l    d0,a0
  1041.         JSRLIB    CloseWindow
  1042.  
  1043. 1$        bsr    CloseDoubleBuf
  1044.  
  1045.         move.l    _IntuitionBase,a6
  1046.         move.l    TheScreen,d0
  1047.         beq    2$
  1048.         move.l    d0,a0
  1049.         JSRLIB    CloseScreen
  1050.  
  1051. 2$        move.l    InvisibleMap,d0
  1052.         beq    3$
  1053.         move.l    _SysBase,a6
  1054.         move.l    d0,a1
  1055.         JSRLIB    FreeVec
  1056.  
  1057. 3$        bra    Exitc2p4
  1058.  
  1059. ; Amiga-Mono
  1060. CloseAmigaMono    move.l    _IntuitionBase,a6
  1061.         move.l    TheWindow,d0
  1062.         beq    1$
  1063.         move.l    d0,a0
  1064.         JSRLIB    CloseWindow
  1065.  
  1066. 1$        bsr    CloseDoubleBuf
  1067.  
  1068.         move.l    _IntuitionBase,a6
  1069.         move.l    TheScreen,d0
  1070.         beq    2$
  1071.         move.l    d0,a0
  1072.         JSRLIB    CloseScreen
  1073. 2$        rts
  1074.  
  1075. ; Picasso
  1076. ClosePicasso    move.l    _IntuitionBase,a6
  1077.         move.l    TheWindow,d0
  1078.         beq    1$
  1079.         move.l    d0,a0
  1080.         JSRLIB    CloseWindow
  1081.  
  1082. 1$        move.l    _VilIntuiBase,a6
  1083.         move.l    TheScreen,d0
  1084.         beq    2$
  1085.         move.l    d0,a0
  1086.         jsr    UnLockVillageScreen(a6)
  1087.         move.l    TheScreen,a0
  1088.         jsr    CloseVillageScreen(a6)
  1089. 2$        rts
  1090.  
  1091. ; EGS
  1092. CloseEGS    move.l    _EGSBase,a6
  1093.         move.l    TheScreen,d0
  1094.         beq    1$
  1095.         move.l    d0,a0
  1096.         jsr    E_CloseScreen(a6)
  1097.  
  1098. 1$        move.l    InvisibleMap,d0
  1099.         beq    2$
  1100.         move.l    d0,a0
  1101.         subq.b    #1,ebm_Lock(a0)
  1102.         jsr    E_DisposeBitMap(a6)
  1103. 2$        rts
  1104.  
  1105. ; Cybergraphics
  1106. CloseCyber    move.l    _IntuitionBase,a6
  1107.         move.l    TheWindow,d0
  1108.         beq    1$
  1109.         move.l    d0,a0
  1110.         JSRLIB    CloseWindow
  1111.  
  1112. 1$        move.l    TheScreen,d0
  1113.         beq    2$
  1114.         move.l    d0,a0
  1115.         JSRLIB    CloseScreen
  1116. 2$        rts
  1117.  
  1118. ; Merlin
  1119. CloseMerlin    move.l    _IntuitionBase,a6
  1120.         move.l    TheWindow,d0
  1121.         beq    1$
  1122.         move.l    d0,a0
  1123.         JSRLIB    CloseWindow
  1124.  
  1125. 1$        move.l    _HRGSystemBase,a6
  1126.         move.l    MerlScreen,d0
  1127.         beq    2$
  1128.         move.l    d0,a0
  1129.         jsr    hrCloseScreen(a6)
  1130. 2$        rts
  1131.  
  1132.  
  1133. *
  1134. * Double Buffering schließen
  1135. *
  1136.  
  1137. ; Zweiten Comparison Buffer freigeben
  1138. CloseDoubleBuf    tst.w    UsingDB
  1139.         beq    2$
  1140.  
  1141.         move.l    _SysBase,a6
  1142.         move.l    ComparisonBuf1,d0
  1143.         beq    1$
  1144.         move.l    d0,a1
  1145.         JSRLIB    FreeVec
  1146.  
  1147. ; Screen Buffer freigeben
  1148. 1$        move.l    _IntuitionBase,a6
  1149.         move.l    TheScreen,a0
  1150.         move.l    ScrBuf0,a1        ;NULL ist OK
  1151.         JSRLIB    FreeScreenBuffer
  1152.  
  1153.         move.l    TheScreen,a0
  1154.         move.l    ScrBuf1,a1
  1155.         JSRLIB    FreeScreenBuffer
  1156. 2$        rts
  1157.  
  1158.  
  1159. **
  1160. ** Amiga-Anzeige nach vorne
  1161. **
  1162.  
  1163. AmigaToFront    move.l    a6,-(sp)
  1164.         cmp.w    #STYP_EGS,ScreenType
  1165.         beq    ATFEGS
  1166.  
  1167. ; Bei Picasso Screen unlocken
  1168.         cmp.w    #STYP_PICASSO,ScreenType
  1169.         bne    1$
  1170.         move.l    _VilIntuiBase,a6
  1171.         move.l    TheScreen,a0
  1172.         jsr    UnLockVillageScreen(a6)
  1173. 1$
  1174.  
  1175. ; Amiga/Picasso/Cyber/Merlin
  1176.         move.l    _IntuitionBase,a6
  1177.         move.l    TheScreen,a0
  1178.         JSRLIB    ScreenToBack
  1179.         move.l    (sp)+,a6
  1180.         rts
  1181.  
  1182. ; EGS
  1183. ATFEGS        move.l    _EGSBase,a6
  1184.         jsr    E_ActivateAmigaScreen(a6)
  1185.         move.l    TheScreen,a0
  1186.         jsr    E_ScreenToBack(a6)
  1187.         move.l    (sp)+,a6
  1188.         rts
  1189.  
  1190.  
  1191. **
  1192. ** Emulator-Anzeige nach vorne
  1193. **
  1194.  
  1195. EmulToFront    move.l    a6,-(sp)
  1196.         cmp.w    #STYP_EGS,ScreenType
  1197.         beq    ETFEGS
  1198.  
  1199. ; Amiga/Picasso/Cyber/Merlin
  1200.         move.l    _IntuitionBase,a6
  1201.         move.l    TheScreen,a0
  1202.         JSRLIB    ScreenToFront
  1203.  
  1204. ; Bei Picasso Screen locken
  1205.         cmp.w    #STYP_PICASSO,ScreenType
  1206.         bne    1$
  1207.         move.l    _VilIntuiBase,a6
  1208.         move.l    TheScreen,a0
  1209.         jsr    LockVillageScreen(a6)
  1210. 1$        move.l    (sp)+,a6
  1211.         rts
  1212.  
  1213. ; EGS
  1214. ETFEGS        move.l    _EGSBase,a6
  1215.         jsr    E_ActivateEGSScreen(a6)
  1216.         move.l    TheScreen,a0
  1217.         jsr    E_ScreenToFront(a6)
  1218.         move.l    (sp)+,a6
  1219.         rts
  1220.  
  1221.  
  1222. **
  1223. ** Auf rechten Mausklick warten, Tastatur handhaben
  1224. **
  1225.  
  1226. WaitForClick    cmp.w    #STYP_EGS,ScreenType
  1227.         beq    WFCEGS
  1228.  
  1229. ; Amiga/Picasso/Cyber/Merlin
  1230. WFCAmiga    move.l    _SysBase,a6
  1231.         move.l    WindowPort,a0
  1232.         JSRLIB    WaitPort
  1233.  
  1234.         move.l    WindowPort,a0
  1235.         JSRLIB    GetMsg
  1236.         tst.l    d0
  1237.         beq    WFCAmiga
  1238.         move.l    d0,a1
  1239.         move.l    20(a1),d2    ;d2: Class
  1240.         move.w    24(a1),d3    ;d3: Code
  1241.         move.l    32(a1),d4    ;d4: MouseXY
  1242.         move.w    26(a1),d5    ;d5: Qualifier
  1243.         JSRLIB    ReplyMsg
  1244.  
  1245. ; Klasse auswerten
  1246.         cmp.l    #IDCMP_MOUSEBUTTONS,d2
  1247.         bne    1$
  1248.         cmp.w    #IECODE_RBUTTON,d3 ;Rechte Maustaste: Beenden
  1249.         beq    WFCDone
  1250.         bra    WFCAmiga
  1251.  
  1252. 1$        cmp.l    #IDCMP_RAWKEY,d2
  1253.         bne    WFCAmiga
  1254.         move.b    d3,d0
  1255.         bsr    KeyPressed    ;Tastaturabfrage
  1256.         bra    WFCAmiga
  1257.  
  1258. ; EGS
  1259. WFCEGS        move.l    _SysBase,a6
  1260.         move.l    EGSPort,a0
  1261.         JSRLIB    WaitPort
  1262.  
  1263.         move.l    EGSPort,a0
  1264.         JSRLIB    GetMsg
  1265.         tst.l    d0
  1266.         beq    WFCEGS
  1267.         move.l    d0,a1
  1268.         move.l    20(a1),d2    ;d2: Class
  1269.         move.w    24(a1),d3    ;d3: Code
  1270.         move.l    32(a1),d4    ;d4: MouseXY
  1271.         move.w    26(a1),d5    ;d5: Qualifier
  1272.         JSRLIB    ReplyMsg
  1273.  
  1274. ; Klasse auswerten
  1275.         cmp.w    #E_eMOUSEBUTTONS,d2
  1276.         bne    1$
  1277.         cmp.w    #IECODE_RBUTTON,d3 ;Rechte Maustaste: Beenden
  1278.         beq    WFCDone
  1279.         bra    WFCEGS
  1280.  
  1281. 1$        cmp.w    #E_eRAWKEY,d2
  1282.         bne    WFCEGS
  1283.         move.b    d3,d0
  1284.         bsr    KeyPressed    ;Tastaturabfrage
  1285.         bra    WFCEGS
  1286.  
  1287. ; Beenden
  1288. WFCDone        rts
  1289.  
  1290.  
  1291. **
  1292. ** CIA-VA14/15 hat sich geändert, Video-Bank wechseln
  1293. ** d0.b: Neue VA ($00-$03)
  1294. **
  1295.  
  1296. ChangedVA    lea    Registers,a0    ;Wichtig für WrVBASE
  1297.         clr.w    d1        ;VABase speichern
  1298.         move.b    d0,d1
  1299.         ror.w    #2,d1
  1300.         move.w    d1,CiaVABase
  1301.  
  1302.         move.b    VBASE(a0),d1 ;Zeiger neu berechnen
  1303.         bra    WrVBASE
  1304.  
  1305.  
  1306. **
  1307. ** Initialisierung vom 6510-Task aus
  1308. **
  1309.  
  1310. ; Signal für c2p4 holen
  1311. Init6569    move.l    _SysBase,a6
  1312.         moveq    #-1,d0
  1313.         JSRLIB    AllocSignal
  1314.         move.b    d0,GfxSig
  1315.         moveq    #0,d1
  1316.         bset    d0,d1
  1317.         move.l    d1,GfxSet
  1318.         rts
  1319.  
  1320.  
  1321. **
  1322. ** Aufräumen vom 6510-Task aus
  1323. **
  1324.  
  1325. ; Ggf. auf Signal von c2p4 warten und freigeben
  1326. Exit6569    move.l    _SysBase,a6
  1327.         tst.w    MustWaitForC2P
  1328.         beq    1$
  1329.         move.l    GfxSet,d0
  1330.         JSRLIB    Wait
  1331.  
  1332. 1$        moveq    #0,d0
  1333.         move.b    GfxSig,d0
  1334.         JMPLIB    FreeSignal
  1335.  
  1336.  
  1337. **
  1338. ** Aus einem VIC-Register lesen
  1339. ** d0.w: Registernummer ($00-$3f)
  1340. ** Rückgabe: d0.b: Byte
  1341. **
  1342. ** Darf das obere Wort von d0 und d1 nicht verändern!
  1343. ** Darf a1 nicht verändern!
  1344. **
  1345.  
  1346. ReadFrom6569    move.l    ReadTab(pc,d0.w*4),a0
  1347.         jmp    (a0)
  1348.  
  1349.         CNOP    0,4
  1350. ReadTab        dc.l    RdSprX
  1351.         dc.l    RdNormal
  1352.         dc.l    RdSprX
  1353.         dc.l    RdNormal
  1354.         dc.l    RdSprX
  1355.         dc.l    RdNormal
  1356.         dc.l    RdSprX
  1357.         dc.l    RdNormal
  1358.         dc.l    RdSprX
  1359.         dc.l    RdNormal
  1360.         dc.l    RdSprX
  1361.         dc.l    RdNormal
  1362.         dc.l    RdSprX
  1363.         dc.l    RdNormal
  1364.         dc.l    RdSprX
  1365.         dc.l    RdNormal
  1366.  
  1367.         dc.l    RdNormal
  1368.         dc.l    RdCTRL1
  1369.         dc.l    RdRASTER
  1370.         dc.l    RdNormal
  1371.         dc.l    RdNormal
  1372.         dc.l    RdNormal
  1373.         dc.l    RdCTRL2
  1374.         dc.l    RdNormal
  1375.         dc.l    RdVBASE
  1376.         dc.l    RdIRQFLAG
  1377.         dc.l    RdIRQMASK
  1378.         dc.l    RdNormal
  1379.         dc.l    RdNormal
  1380.         dc.l    RdNormal
  1381.         dc.l    RdCLXSPR
  1382.         dc.l    RdCLXBGR
  1383.  
  1384.         dc.l    RdColor
  1385.         dc.l    RdColor
  1386.         dc.l    RdColor
  1387.         dc.l    RdColor
  1388.         dc.l    RdColor
  1389.         dc.l    RdColor
  1390.         dc.l    RdColor
  1391.         dc.l    RdColor
  1392.         dc.l    RdColor
  1393.         dc.l    RdColor
  1394.         dc.l    RdColor
  1395.         dc.l    RdColor
  1396.         dc.l    RdColor
  1397.         dc.l    RdColor
  1398.         dc.l    RdColor
  1399.         dc.l    RdUndef
  1400.  
  1401.         dc.l    RdUndef
  1402.         dc.l    RdUndef
  1403.         dc.l    RdUndef
  1404.         dc.l    RdUndef
  1405.         dc.l    RdUndef
  1406.         dc.l    RdUndef
  1407.         dc.l    RdUndef
  1408.         dc.l    RdUndef
  1409.         dc.l    RdUndef
  1410.         dc.l    RdUndef
  1411.         dc.l    RdUndef
  1412.         dc.l    RdUndef
  1413.         dc.l    RdUndef
  1414.         dc.l    RdUndef
  1415.         dc.l    RdUndef
  1416.         dc.l    RdUndef
  1417.  
  1418. RdNormal    lea    Registers,a0
  1419.         move.b    (a0,d0.w),d0
  1420.         rts
  1421.  
  1422. RdSprX        lea    Registers,a0
  1423.         move.b    SPRX0+1(a0,d0.w),d0    ;LSB lesen
  1424.         rts
  1425.  
  1426. RdCTRL1        lea    Registers,a0
  1427.         move.b    CTRL1(a0),d0
  1428.         and.b    #$7f,d0
  1429.         move.b    CURRENTRASTER(a0),d1    ;MSB des Rasterzählers lesen
  1430.         and.b    #$01,d1
  1431.         ror.b    #1,d1
  1432.         or.b    d1,d0            ;und dazunehmen
  1433.         rts
  1434.  
  1435. RdRASTER    move.b    Registers+CURRENTRASTER+1,d0 ;Rasterzähler lesen
  1436.         rts
  1437.  
  1438. RdCTRL2        move.b    Registers+CTRL2,d0
  1439.         or.b    #$c0,d0            ;Unbenutzte Bits auf 1
  1440.         rts
  1441.  
  1442. RdVBASE        move.b    Registers+VBASE,d0
  1443.         or.b    #$01,d0            ;Unbenutzte Bits auf 1
  1444.         rts
  1445.  
  1446. RdIRQFLAG    move.b    Registers+IRQFLAG,d0
  1447.         or.b    #$70,d0            ;Unbenutzte Bits auf 1
  1448.         rts
  1449.  
  1450. RdIRQMASK    move.b    Registers+IRQMASK,d0
  1451.         or.b    #$f0,d0            ;Unbenutzte Bits auf 1
  1452.         rts
  1453.  
  1454. RdCLXSPR    lea    Registers+CLXSPR,a0
  1455.         move.b    (a0),d0            ;Lesen und löschen
  1456.         clr.b    (a0)
  1457.         rts
  1458.  
  1459. RdCLXBGR    lea    Registers+CLXBGR,a0
  1460.         move.b    (a0),d0            ;Lesen und löschen
  1461.         clr.b    (a0)
  1462.         rts
  1463.  
  1464. RdColor        lea    Registers,a0
  1465.         move.b    (a0,d0.w),d0        ;Bei den Farbregistern
  1466.         or.b    #$f0,d0            ;das obere Nibble setzen
  1467.         rts
  1468.  
  1469. RdUndef        move.b    #$ff,d0            ;Nicht existierendes Register
  1470.         rts
  1471.  
  1472.  
  1473. **
  1474. ** In ein VIC-Register schreiben
  1475. ** d0.w: Registernummer ($00-$3f)
  1476. ** d1.b: Byte
  1477. **
  1478. ** Darf das obere Wort von d0 und d1 nicht verändern!
  1479. **
  1480.  
  1481. WriteTo6569    lea    Registers,a0
  1482.         move.l    WriteTab(pc,d0.w*4),a1
  1483.         jmp    (a1)
  1484.  
  1485.         CNOP    0,4
  1486. WriteTab    dc.l    WrSprX
  1487.         dc.l    WrNormal
  1488.         dc.l    WrSprX
  1489.         dc.l    WrNormal
  1490.         dc.l    WrSprX
  1491.         dc.l    WrNormal
  1492.         dc.l    WrSprX
  1493.         dc.l    WrNormal
  1494.         dc.l    WrSprX
  1495.         dc.l    WrNormal
  1496.         dc.l    WrSprX
  1497.         dc.l    WrNormal
  1498.         dc.l    WrSprX
  1499.         dc.l    WrNormal
  1500.         dc.l    WrSprX
  1501.         dc.l    WrNormal
  1502.  
  1503.         dc.l    WrSprXMSB
  1504.         dc.l    WrCTRL1
  1505.         dc.l    WrRASTER
  1506.         dc.l    WrNormal
  1507.         dc.l    WrNormal
  1508.         dc.l    WrNormal
  1509.         dc.l    WrCTRL2
  1510.         dc.l    WrNormal
  1511.         dc.l    WrVBASE
  1512.         dc.l    WrIRQFLAG
  1513.         dc.l    WrIRQMASK
  1514.         dc.l    WrMDP
  1515.         dc.l    WrMMC
  1516.         dc.l    WrMXE
  1517.         dc.l    WrUndef
  1518.         dc.l    WrUndef
  1519.  
  1520.         dc.l    WrBorder
  1521.         dc.l    WrBack0
  1522.         dc.l    WrNormal
  1523.         dc.l    WrNormal
  1524.         dc.l    WrNormal
  1525.         dc.l    WrNormal
  1526.         dc.l    WrNormal
  1527.         dc.l    WrNormal
  1528.         dc.l    WrNormal
  1529.         dc.l    WrNormal
  1530.         dc.l    WrNormal
  1531.         dc.l    WrNormal
  1532.         dc.l    WrNormal
  1533.         dc.l    WrNormal
  1534.         dc.l    WrNormal
  1535.         dc.l    WrUndef
  1536.  
  1537.         dc.l    WrUndef
  1538.         dc.l    WrUndef
  1539.         dc.l    WrUndef
  1540.         dc.l    WrUndef
  1541.         dc.l    WrUndef
  1542.         dc.l    WrUndef
  1543.         dc.l    WrUndef
  1544.         dc.l    WrUndef
  1545.         dc.l    WrUndef
  1546.         dc.l    WrUndef
  1547.         dc.l    WrUndef
  1548.         dc.l    WrUndef
  1549.         dc.l    WrUndef
  1550.         dc.l    WrUndef
  1551.         dc.l    WrUndef
  1552.         dc.l    WrUndef
  1553.  
  1554. WrNormal    move.b    d1,(a0,d0.w)
  1555. WrUndef        rts
  1556.  
  1557. WrSprX        move.b    d1,SPRX0+1(a0,d0.w)
  1558.         rts
  1559.  
  1560. WrSprXMSB    move.b    d1,MX8(a0)
  1561.         lea    SPRX7(a0),a0    ;MSBs in 16-Bit-Werte umrechnen
  1562.         moveq    #7,d0
  1563. 1$        add.b    d1,d1
  1564.         bcs    2$
  1565.         clr.b    (a0)
  1566.         bra    3$
  1567. 2$        move.b    #1,(a0)
  1568. 3$        subq.w    #2,a0
  1569.         dbra    d0,1$
  1570.         rts
  1571.  
  1572. WrCTRL1        move.b    d1,CTRL1(a0)
  1573.         move.b    d1,d0
  1574.         and.w    #7,d0
  1575.         move.w    d0,YSCROLL(a0)
  1576.         move.b    d1,d0        ;MSB Raster
  1577.         and.b    #$80,d0
  1578.         rol.b    #1,d0
  1579.         move.b    d0,IRQRASTER(a0)
  1580.         btst    #3,d1        ;24/25 Zeilen
  1581.         beq    1$
  1582.         move.w    #Row25YStart,DYSTART(a0)
  1583.         move.w    #Row25YStop,DYSTOP(a0)
  1584.         bra    SetDispProc
  1585. 1$        move.w    #Row24YStart,DYSTART(a0)
  1586.         move.w    #Row24YStop,DYSTOP(a0)
  1587.         bra    SetDispProc
  1588.  
  1589. SetDispProc    moveq    #0,d0        ;ECM, BMM und MCM holen
  1590.         move.b    CTRL1(a0),d0
  1591.         and.b    #$60,d0
  1592.         move.b    CTRL2(a0),d1
  1593.         and.b    #$10,d1
  1594.         or.b    d1,d0
  1595.         lsr.b    #2,d0        ;Als Index in DispProcTab benutzen
  1596.         cmp.w    #STYP_AMIGAMONO,ScreenType
  1597.         beq    1$
  1598.         move.l    (DispProcTab,pc,d0.w),DisplayProc
  1599.         rts
  1600. 1$        move.l    (MonoDispProcTab,pc,d0.w),DisplayProc
  1601.         rts
  1602.  
  1603. WrRASTER    move.b    d1,IRQRASTER+1(a0)
  1604.         rts
  1605.  
  1606. WrCTRL2        move.b    d1,CTRL2(a0)
  1607.         move.b    d1,d0
  1608.         and.w    #7,d0
  1609.         move.w    d0,XSCROLL(a0)
  1610.         btst    #3,d1        ;38/40 Zeilen
  1611.         beq    1$
  1612.         clr.b    IS38COL(a0)
  1613.         move.w    #Col40XStart,DXSTART(a0)
  1614.         move.w    #Col40XStop,DXSTOP(a0)
  1615.         bra    SetDispProc
  1616. 1$        st.b    IS38COL(a0)
  1617.         move.w    #Col38XStart,DXSTART(a0)
  1618.         move.w    #Col38XStop,DXSTOP(a0)
  1619.         bra    SetDispProc
  1620.  
  1621. WrVBASE        move.l    a0,a1        ;a1: Zeiger auf Register
  1622.         move.b    d1,VBASE(a1)
  1623.  
  1624.         move.w    d1,-(sp)
  1625.         move.b    d1,d0        ;Videomatrixbasis berechnen
  1626.         and.w    #$f0,d0
  1627.         lsl.w    #6,d0
  1628.         GetPhysical
  1629.         move.l    a0,MATRIXBASE(a1)
  1630.         move.w    (sp),d1        ;Nur lesen, nicht entfernen
  1631.  
  1632.         move.b    d1,d0        ;Zeichengeneratorbasis berechnen
  1633.         and.w    #$0e,d0
  1634.         ror.w    #6,d0
  1635.         GetPhysical
  1636.         move.l    a0,CHARBASE(a1)
  1637.         move.w    (sp)+,d1
  1638.  
  1639.         move.b    d1,d0
  1640.         and.w    #$08,d0
  1641.         ror.w    #6,d0
  1642.         GetPhysical
  1643.         move.l    a0,BITMAPBASE(a1)
  1644.         rts
  1645.  
  1646. WrIRQFLAG    not.b    d1        ;Gesetztes Bit: Flag löschen
  1647.         and.b    #$0f,d1
  1648.         move.b    IRQFLAG(a0),d0
  1649.         and.b    d1,d0
  1650.  
  1651.         clr.b    IntIsVICIRQ    ;IRQ zurücknehmen
  1652.  
  1653.         move.b    d0,d1        ;Erlaubter IRQ noch gesetzt?
  1654.         and.b    IRQMASK(a0),d1
  1655.         beq    1$
  1656.         or.b    #$80,d0        ;Ja, Master-Bit setzen
  1657. 1$        move.b    d0,IRQFLAG(a0)
  1658.         rts
  1659.  
  1660. WrIRQMASK    and.b    #$0f,d1
  1661.         move.b    d1,IRQMASK(a0)
  1662.         rts
  1663.  
  1664. WrMDP        move.b    d1,MDP(a0)
  1665.         bra    SetSpriteProcs
  1666.  
  1667. WrMMC        move.b    d1,MMC(a0)
  1668.         bra    SetSpriteProcs
  1669.  
  1670. WrMXE        move.b    d1,MXE(a0)        ;Fällt durch!
  1671.  
  1672. SetSpriteProcs    moveq    #7,d1
  1673.         lea    Sprite7Proc,a1
  1674. 1$        moveq    #0,d0
  1675.         btst    d1,MXE(a0)
  1676.         beq    2$
  1677.         or.b    #1,d0
  1678. 2$        btst    d1,MMC(a0)
  1679.         beq    3$
  1680.         or.b    #2,d0
  1681. 3$        btst    d1,MDP(a0)
  1682.         beq    4$
  1683.         or.b    #4,d0
  1684. 4$        move.l    (SpriteProcTab,pc,d0.w*4),(a1)
  1685.         subq.w    #4,a1
  1686.         dbra    d1,1$
  1687.         rts
  1688.  
  1689. WrBorder    move.b    d1,EC(a0)
  1690.         move.b    d1,d0        ;In ein Langwort konvertieren
  1691.         lsl.w    #8,d0
  1692.         move.b    d1,d0
  1693.         move.w    d0,d1
  1694.         swap    d0
  1695.         move.w    d1,d0
  1696.         move.l    d0,BORDERLONG(a0)
  1697.         moveq    #0,d0
  1698.         rts
  1699.  
  1700. WrBack0        move.b    d1,B0C(a0)
  1701.         move.b    d1,d0        ;In ein Langwort konvertieren
  1702.         lsl.w    #8,d0
  1703.         move.b    d1,d0
  1704.         move.w    d0,d1
  1705.         swap    d0
  1706.         move.w    d1,d0
  1707.         move.l    d0,BACK0LONG(a0)
  1708.         moveq    #0,d0
  1709.         rts
  1710.  
  1711.  
  1712. **
  1713. ** Eine Rasterzeile des VIC ausführen
  1714. **
  1715. ** d7: Rasterzeilenzähler
  1716. ** a4: Zeiger auf VIC-Register
  1717. ** a5: Zeiger auf das Ziel im Bildschirmspeicher
  1718. **
  1719.  
  1720. ; VBlank: Zähler zurücksetzen und Bitmap wechseln
  1721. VICVBlank    move.w    #-1,CURRENTRASTER(a4)
  1722.         clr.w    VCBASE(a4)
  1723.  
  1724.         btst    #4,CTRL1(a4)        ;Bildschirm abschalten, wenn DEN gelöscht
  1725.         bne    1$
  1726.         st.b    SCREENOFF(a4)
  1727.         bra    2$
  1728. 1$        clr.b    SCREENOFF(a4)
  1729. 2$
  1730.         bsr    CountTODs        ;TODs zählen
  1731.  
  1732.         st.b    SKIPFRAME(a4)
  1733.         subq.w    #1,SkipCounter
  1734.         bne    3$
  1735.         move.w    SkipLatch,SkipCounter
  1736.         clr.b    SKIPFRAME(a4)
  1737.  
  1738. 3$        tst.b    SKIPFRAME(a4)
  1739.         bne    Periodic6569
  1740.         move.l    VBlankProc,a0
  1741.         jmp    (a0)
  1742.  
  1743. ; EGS: BitMap wechseln (Double Buffering)
  1744. EGSVBlank    move.l    _EGSBase(pc),a6        ;Vorher unsichtbare Bitmap
  1745.  
  1746.         move.l    TheScreen,a0        ;darstellen
  1747.         move.l    InvisibleMap,a1
  1748.         subq.b    #1,ebm_Lock(a1)
  1749.         jsr    E_FlipMap(a6)
  1750.         move.l    d0,InvisibleMap        ;In alte Bitmap ab jetzt zeichnen
  1751.  
  1752.         move.l    d0,a0            ;Adresse ermitteln
  1753.         addq.b    #1,ebm_Lock(a0)
  1754.         move.l    ebm_Dest(a0),CURRENTA5(a4)
  1755.  
  1756.         bra    Periodic6569
  1757.  
  1758. ; Cybergraphics: Bei TurboCyber a5 neu laden
  1759. CyberVBlank    tst.l    TurboCyber
  1760.         beq    Periodic6569
  1761.         move.l    InvisibleMap,CURRENTA5(a4)
  1762.         bra    Periodic6569
  1763.  
  1764. ; Merlin: a5 neu laden
  1765. MerlinVBlank    move.l    InvisibleMap,CURRENTA5(a4)
  1766.         bra    Periodic6569
  1767.  
  1768. ; Amiga: Chunky-BitMap in Planar konvertieren
  1769. AmigaVBlank    tst.w    MustWaitForC2P(pc)    ;Ggf. erst auf c2p4 warten
  1770.         beq    1$
  1771.         move.l    _SysBase,a6
  1772.         move.l    GfxSet,d0
  1773.         JSRLIB    Wait
  1774.  
  1775. 1$        tst.w    UsingDB            ;Double Buffering?
  1776.         beq    4$
  1777.  
  1778. 3$        move.l    _IntuitionBase,a6    ;Ja, Puffer tauschen
  1779.         lea    ScrBuf0,a1
  1780.         move.w    InvBufNum+2,d0
  1781.         move.l    (a1,d0.w*4),a1
  1782.         move.l    TheScreen,a0
  1783.         JSRLIB    ChangeScreenBuffer
  1784.         tst.l    d0
  1785.         bne    2$
  1786.         move.l    _GfxBase,a6        ;Nicht gelungen, warten
  1787.         JSRLIB    WaitTOF            ; und nochmal versuchen
  1788.         bra    3$
  1789.  
  1790. 2$        eor.w    #1,InvBufNum+2        ;Adresse des neuen Grafikspeichers holen
  1791.         move.l    InvisibleMap,a2        ;Neue Konvertierung starten
  1792.         lea    ComparisonBuf,a0
  1793.         move.w    InvBufNum+2,d0
  1794.         move.l    (a0,d0.w*4),a3
  1795.         lea    ScrBuf0,a0
  1796.         move.l    (a0,d0.w*4),a0
  1797.         move.l    sb_BitMap(a0),a0
  1798.         lea    bm_Planes(a0),a4
  1799.         move.l    CPUTask,a5
  1800.         move.l    GfxSet,d0
  1801.         jsr    _c2p4
  1802.  
  1803.         move.l    InvisibleMap,Registers+CURRENTA5
  1804.         move.w    #-1,MustWaitForC2P
  1805.         bra    Periodic6569
  1806.  
  1807. 4$        move.l    InvisibleMap,a2        ;Kein DB: Neue Konvertierung starten
  1808.         move.l    ComparisonBuf,a3
  1809.         move.l    TheRastPort,a4
  1810.         move.l    rp_BitMap(a4),a4
  1811.         lea    bm_Planes(a4),a4
  1812.         move.l    CPUTask,a5
  1813.         move.l    GfxSet,d0
  1814.         jsr    _c2p4
  1815.  
  1816.         move.l    InvisibleMap,Registers+CURRENTA5
  1817.         move.w    #-1,MustWaitForC2P
  1818.         bra    Periodic6569
  1819.  
  1820. ; Amiga-Mono: Double Buffering
  1821. AmigaMonoVBlank    tst.w    UsingDB(pc)        ;Double Buffering?
  1822.         beq    1$
  1823.  
  1824. 3$        move.l    _IntuitionBase,a6
  1825.         lea    ScrBuf0,a1
  1826.         move.w    InvBufNum+2,d0
  1827.         move.l    (a1,d0.w*4),a1
  1828.         move.l    TheScreen,a0
  1829.         JSRLIB    ChangeScreenBuffer
  1830.         tst.l    d0
  1831.         bne    2$
  1832.         move.l    _GfxBase,a6        ;Nicht gelungen, warten
  1833.         JSRLIB    WaitTOF            ; und nochmal versuchen
  1834.         bra    3$
  1835.  
  1836. 2$        eor.w    #1,InvBufNum+2        ;Adresse des neuen Grafikspeichers holen
  1837.         lea    ScrBuf0,a0
  1838.         move.w    InvBufNum+2,d0
  1839.         move.l    (a0,d0.w*4),a0
  1840.         move.l    sb_BitMap(a0),a0
  1841.         move.l    bm_Planes(a0),CURRENTA5(a4)
  1842.         bra    Periodic6569
  1843.  
  1844. 1$        move.l    InvisibleMap,CURRENTA5(a4) ;Kein DB
  1845.         bra    Periodic6569
  1846.  
  1847. ; Picasso: Double Buffering
  1848. PicassoVBlank    move.l    _VilIntuiBase,a6
  1849.  
  1850.         move.l    TheScreen,a0
  1851.         jsr    UnLockVillageScreen(a6)
  1852.  
  1853.         move.l    TheScreen,a0        ;Vorher unsichtbare Bitmap
  1854.         move.l    InvBufNum,d0        ;darstellen
  1855.         jsr    VillageSetDisplayBuf(a6)
  1856.  
  1857.         eor.l    #1,InvBufNum        ;Puffer wechseln
  1858.         move.l    TheScreen,a0
  1859.         jsr    LockVillageScreen(a6)
  1860.         move.l    TheScreen,a0        ;Adresse ermitteln
  1861.         move.l    InvBufNum,d0
  1862.         jsr    VillageGetBufAddr(a6)
  1863.         move.l    d0,CURRENTA5(a4)
  1864.  
  1865.     ;Fällt durch!
  1866. *
  1867. * Aktuelle Rasterzeile holen
  1868. *
  1869.  
  1870. Periodic6569    lea    Registers,a4
  1871.         move.w    CURRENTRASTER(a4),d7
  1872.  
  1873. *
  1874. * Rasterzähler erhöhen (muß hier geschehen, damit bei einem Raster-IRQ
  1875. *  der Wert des Rasterzählers mit der IRQ-Zeile übereinstimmt)
  1876. *
  1877.  
  1878.         addq.w    #1,d7
  1879.         move.w    d7,CURRENTRASTER(a4)
  1880.         cmp.w    #TotalRasters,d7    ;Bildende erreicht?
  1881.         beq    VICVBlank
  1882.  
  1883. *
  1884. * Raster-IRQ auslösen, wenn Vergeichswert erreicht
  1885. *
  1886.  
  1887.         cmp.w    IRQRASTER(a4),d7    ;IRQ-Zeile erreicht?
  1888.         bne    NoRasterIRQ
  1889.         or.b    #$01,IRQFLAG(a4)    ;Ja, IRST-Bit setzen
  1890.         btst    #0,IRQMASK(a4)        ;Raster-IRQ erlaubt?
  1891.         beq    NoRasterIRQ
  1892.         or.b    #$80,IRQFLAG(a4)    ;Ja, IRQ-Bit setzen
  1893.         st.b    IntIsVICIRQ        ;Und Interrupt auslösen
  1894. NoRasterIRQ
  1895.  
  1896. *
  1897. * Neue Anzahl CPU-Zyklen setzen
  1898. *
  1899.  
  1900.         move.w    NormalCycles,CyclesLeft
  1901.  
  1902.         tst.b    SKIPFRAME(a4)
  1903.         bne    VICSkip
  1904.  
  1905. *
  1906. * Innerhalb des sichtbaren Bereichs?
  1907. *
  1908.  
  1909.         cmp.w    #FirstDispLine,d7
  1910.         blo    VICNop
  1911.         cmp.w    #LastDispLine,d7
  1912.         bhi    VICNop
  1913.  
  1914. *
  1915. * Zeiger in Bildschirmspeicher nach a5 holen
  1916. *
  1917.  
  1918.         move.w    ScreenType,d0
  1919.         jmp    ([GetA5JmpTab,pc,d0.w*4])
  1920. GetA5JmpTab    dc.l    GetA5EGS
  1921.         dc.l    GetA5Picasso
  1922.         dc.l    GetA5Amiga
  1923.         dc.l    GetA5AmigaMono
  1924.         dc.l    GetA5Cyber
  1925.         dc.l    GetA5Merlin
  1926.  
  1927. GetA5AmigaMono    move.l    CURRENTA5(a4),a5    ;Amiga-Mono: In die Bitplane schreiben
  1928.         bra    AmigaMono6569        ; und in spezielle VIC-Routine springen
  1929. GetA5EGS
  1930. GetA5Picasso
  1931. GetA5Cyber
  1932. GetA5Merlin
  1933.         lea    LineStore,a5        ;EGS/Picasso/Cyber/Merlin: In LineStore schreiben
  1934.         bra    GetA5Done
  1935. GetA5Amiga    move.l    CURRENTA5(a4),a5    ;Amiga: In die Chunky-Map schreiben
  1936. GetA5Done
  1937.  
  1938. *
  1939. * Bei abgeschaltetem Bildschirm nur Rahmen zeichnen
  1940. *
  1941.  
  1942.         tst.b    SCREENOFF(a4)
  1943.         bne    TBBorderDraw
  1944.  
  1945. *
  1946. * VC-Zähler setzen
  1947. *
  1948.  
  1949.         move.w    VCBASE(a4),VCCOUNT(a4)
  1950.  
  1951. *
  1952. * "Bad Lines"-Videomatrixzugriff:
  1953. * 40 Bytes aus Videomatrix und Farb-RAM lesen und zwischenspeichern
  1954. *
  1955.  
  1956.         cmp.w    #FirstDMALine,d7 ;Innerhalb des DMA-Bereiches?
  1957.         blo    NoBadLine
  1958.         cmp.w    #LastDMALine,d7
  1959.         bhi    NoBadLine
  1960.  
  1961.         move.b    d7,d0        ;Ja, stimmen die unteren Bits
  1962.         and.b    #7,d0        ;der Rasterzeile mit dem Y-Scroll
  1963.         cmp.b    YSCROLL+1(a4),d0 ;überein?
  1964.         bne    NoBadLine
  1965.  
  1966. IsBadLine    move.w    VCCOUNT(a4),d2    ;d2: VC Videomatrix-Zähler
  1967.  
  1968.         move.l    MATRIXBASE(a4),a0 ;Videomatrixbasis holen
  1969.         add.w    d2,a0        ;Videomatrixzähler dazunehmen
  1970.  
  1971.         move.l    TheColor(pc),a2    ;Zeiger auf Farb-RAM holen
  1972.         add.w    d2,a2        ;Videomatrixzähler dazunehmen
  1973.  
  1974.         lea    MatrixLine,a1    ;Videomatrix- und Farb-RAM-Zeile lesen
  1975.         lea    ColorLine,a3
  1976.         movem.l    (a0)+,d0-d6    ;Je 40 Bytes kopieren
  1977.         movem.l    d0-d6,(a1)
  1978.         movem.l    (a2)+,d0-d6
  1979.         movem.l    d0-d6,(a3)
  1980.         movem.l    (a0)+,d0-d2
  1981.         movem.l    d0-d2,28(a1)
  1982.         movem.l    (a2)+,d0-d2
  1983.         movem.l    d0-d2,28(a3)
  1984.  
  1985.         clr.w    RC(a4)        ;RC zurücksetzen
  1986.         clr.b    DISPLAYOFF(a4)    ;Darstellung anschalten
  1987.  
  1988.         move.w    BadLineCycles,CyclesLeft ;Andere Anzahl Zyklen
  1989. NoBadLine
  1990.  
  1991. *
  1992. * Oberen und unteren Rahmen handhaben
  1993. *
  1994.  
  1995.         cmp.w    DYSTOP(a4),d7    ;Unteres Ende des Fensters erreicht
  1996.         bne    1$        ; -> Rahmen einschalten
  1997.         st.b    BORDERON(a4)
  1998.         bra    TBBorderDraw
  1999.  
  2000. 1$        cmp.w    DYSTART(a4),d7    ;Oberes Ende des Fensters erreicht
  2001.         bne    TBBorderDone    ; -> Rahmen abschalten
  2002.         clr.b    BORDERON(a4)
  2003.         bra    TBNoBorder
  2004.  
  2005. TBBorderDone    tst.b    BORDERON(a4)    ;Rahmen an?
  2006.         beq    TBNoBorder
  2007.  
  2008. TBBorderDraw    move.l    CURRENTA5(a4),a0 ;Ja, Rahmen malen. Und zwar in jedem
  2009.                     ; Fall direkt in die Bitmap schreiben
  2010.                     ; (kein Umweg über LineStore)
  2011.         move.l    BORDERLONG(a4),d0 ;d0.l: Rahmenfarbe
  2012.         move.w    #DisplayX/4-1,d1
  2013. 1$        move.l    d0,(a0)+
  2014.         dbra    d1,1$
  2015.         cmp.w    #STYP_CYBER,ScreenType
  2016.         bne    VICIncA5    ;Sonst nix
  2017.         tst.l    TurboCyber
  2018.         bne    VICIncA5
  2019.         bra    VICNextCyber
  2020. TBNoBorder
  2021.  
  2022. *
  2023. * Inhalt des Fensters: Darstellung eingeschaltet?
  2024. *
  2025.  
  2026.         lea    Col40XStart(a5),a1
  2027.         add.w    XSCROLL(a4),a1    ;a1: Ziel in Bildschirmspeicher
  2028.         lea    MatrixLine,a2    ;a2: Zeichencodes
  2029.         lea    ColorLine,a3    ;a3: Farbcodes
  2030.         lea    GfxCollBuf+Col40XStart,a6
  2031.         add.w    XSCROLL(a4),a6    ;a6: Grafik-Kollisionspuffer
  2032.  
  2033.         tst.b    DISPLAYOFF(a4)    ;$3FFF darstellen?
  2034.         bne    Show3FFF
  2035.  
  2036.         jmp    ([DisplayProc])    ;Nein, Routine für entsp. Modus anspringen
  2037.  
  2038. *
  2039. * Standard-Text: Zeichendaten holen und darstellen
  2040. *
  2041.  
  2042. TextStd        add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  2043.  
  2044.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  2045.         add.w    RC(a4),a0    ;RC dazunehmen
  2046.  
  2047.         move.l    BACK0LONG(a4),d3 ;d3.l: Hintergrundfarbe
  2048.  
  2049.         move.l    d3,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  2050.         move.l    d3,Col40XStart+4(a5)
  2051.  
  2052. ; Schleife für 40 Zeichen
  2053.         moveq    #39,d1        ;d1: Zeichenzähler
  2054.         moveq    #0,d0
  2055. CharLoop    move.b    (a2)+,d0    ;Zeichencode lesen
  2056.         move.b    (a0,d0.w*8),d0    ;Zeichendaten lesen
  2057.         beq    OnlyBack
  2058.         move.b    (a3)+,d2    ;d2: Zeichenfarbe
  2059.  
  2060. ; 8 Pixel konvertieren
  2061.         moveq    #7,d6
  2062. 10$        add.b    d0,d0
  2063.         bcc    11$
  2064.         move.b    d2,(a1)+
  2065.         st.b    (a6)+
  2066.         bra    12$
  2067. 11$        move.b    d3,(a1)+
  2068.         clr.b    (a6)+
  2069. 12$        dbra    d6,10$
  2070.  
  2071.         dbra    d1,CharLoop
  2072.         bra    DoSprites
  2073.  
  2074. ; Nur Hintergrund
  2075.         CNOP    0,4
  2076. OnlyBack    move.l    d3,(a1)+
  2077.         move.l    d3,(a1)+
  2078.         clr.l    (a6)+
  2079.         clr.l    (a6)+
  2080.         addq.w    #1,a3        ;Farb-RAM-Byte überspringen
  2081.         dbra    d1,CharLoop
  2082.         bra    DoSprites
  2083.  
  2084. *
  2085. * Multicolor-Text: Zeichendaten holen und darstellen
  2086. *
  2087.  
  2088. TextMulti    add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  2089.  
  2090.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  2091.         add.w    RC(a4),a0    ;RC dazunehmen
  2092.  
  2093.         move.l    BACK0LONG(a4),d3 ;d3.l: Farbe 0
  2094.  
  2095.         move.w    $22(a4),d4    ;d4.w: Farbe 1
  2096.         move.b    $22(a4),d4
  2097.  
  2098.         move.w    $23(a4),d5    ;d5.w: Farbe 2
  2099.         move.b    $23(a4),d5
  2100.  
  2101.         move.l    d3,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  2102.         move.l    d3,Col40XStart+4(a5)
  2103.  
  2104. ; Schleife für 40 Zeichen
  2105.         moveq    #39,d1        ;d1: Zeichenzähler
  2106.         moveq    #0,d0
  2107. CharMLoop    move.b    (a2)+,d0    ;Zeichencode lesen
  2108.         move.b    (a0,d0.w*8),d0    ;Zeichendaten lesen
  2109.         beq    MOnlyBack
  2110.         move.b    (a3)+,d2    ;d2: Farbnibble
  2111.         bclr    #3,d2        ;Standard oder Multi?
  2112.         beq    StdInMulti
  2113.  
  2114. ; Multicolor: 4 Pixel konvertieren
  2115.         moveq    #3,d6
  2116. 10$        add.b    d0,d0
  2117.         bcc    11$
  2118.         add.b    d0,d0
  2119.         bcc    12$
  2120.         move.b    d2,(a1)+    ;11
  2121.         move.b    d2,(a1)+
  2122.         st.b    (a6)+
  2123.         st.b    (a6)+
  2124.         bra    14$
  2125. 12$        move.w    d5,(a1)+    ;10
  2126.         st.b    (a6)+
  2127.         st.b    (a6)+
  2128.         bra    14$
  2129. 11$        clr.w    (a6)+
  2130.         add.b    d0,d0
  2131.         bcc    13$
  2132.         move.w    d4,(a1)+    ;01
  2133.         bra    14$
  2134. 13$        move.w    d3,(a1)+    ;00
  2135. 14$        dbra    d6,10$
  2136.  
  2137.         dbra    d1,CharMLoop
  2138.         bra    DoSprites
  2139.  
  2140. ; Standard: 8 Pixel konvertieren
  2141.         CNOP    0,4
  2142. StdInMulti    moveq    #7,d6
  2143. 10$        add.b    d0,d0
  2144.         bcc    11$
  2145.         move.b    d2,(a1)+
  2146.         st.b    (a6)+
  2147.         bra    12$
  2148. 11$        move.b    d3,(a1)+
  2149.         clr.b    (a6)+
  2150. 12$        dbra    d6,10$
  2151.  
  2152.         dbra    d1,CharMLoop
  2153.         bra    DoSprites
  2154.  
  2155. ; Nur Hintergrund
  2156.         CNOP    0,4
  2157. MOnlyBack    move.l    d3,(a1)+
  2158.         move.l    d3,(a1)+
  2159.         clr.l    (a6)+
  2160.         clr.l    (a6)+
  2161.         addq.w    #1,a3        ;Farb-RAM-Byte überspringen
  2162.         dbra    d1,CharMLoop
  2163.         bra    DoSprites
  2164.  
  2165. *
  2166. * Extended Color Mode: Grafikdaten holen und darstellen
  2167. *
  2168.  
  2169. TextECM        add.w    #40,VCCOUNT(a4)    ;VC erhöhen (wird nicht verwendet)
  2170.  
  2171.         move.l    CHARBASE(a4),a0    ;a0: Zeichengeneratorbasis
  2172.         add.w    RC(a4),a0    ;RC dazunehmen
  2173.  
  2174.         move.b    $21(a4),d3    ;d3: Hintergrund 0
  2175.         move.b    $22(a4),d4    ;d4: Hintergrund 1
  2176.         move.b    $23(a4),d5    ;d5: Hintergrund 2
  2177.  
  2178.         move.w    LASTBKGD(a4),d0    ;Letzter Hintergrund, wenn X-Scroll>0
  2179.         move.b    LASTBKGD(a4),d0
  2180.  
  2181.         move.w    d0,Col40XStart(a5)
  2182.         move.w    d0,Col40XStart+2(a5)
  2183.         move.w    d0,Col40XStart+4(a5)
  2184.         move.w    d0,Col40XStart+6(a5)
  2185.  
  2186. ; Schleife für 40 Zeichen
  2187. ; d7: Aktuelle Hintergrundfarbe
  2188.         moveq    #39,d1        ;d1: Zeichenzähler
  2189.         moveq    #0,d0
  2190. CharELoop    move.b    (a2)+,d0    ;Zeichencode lesen
  2191.         move.b    (a3)+,d2    ;d2: Farbnibble
  2192.         bclr    #7,d0
  2193.         bne    1$
  2194.         bclr    #6,d0
  2195.         bne    2$
  2196.         move.b    d3,d7        ;00: Hintergrund 0
  2197.         bra    4$
  2198. 2$        move.b    d4,d7        ;01: Hintergrund 1
  2199.         bra    4$
  2200. 1$        bclr    #6,d0
  2201.         bne    3$
  2202.         move.b    d5,d7        ;10: Hintergrund 2
  2203.         bra    4$
  2204. 3$        move.b    $24(a4),d7    ;11: Hintergrund 3
  2205. 4$        move.b    (a0,d0.w*8),d0    ;Zeichendaten lesen
  2206.         beq    EOnlyBack
  2207.  
  2208. ; 8 Pixel konvertieren
  2209.         moveq    #7,d6
  2210. 10$        add.b    d0,d0
  2211.         bcc    11$
  2212.         move.b    d2,(a1)+
  2213.         st.b    (a6)+
  2214.         bra    12$
  2215. 11$        move.b    d7,(a1)+
  2216.         clr.b    (a6)+
  2217. 12$        dbra    d6,10$
  2218.  
  2219.         dbra    d1,CharELoop
  2220.  
  2221.         move.b    d7,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  2222.         move.w    CURRENTRASTER(a4),d7    ;d7 wurde zerstört
  2223.         bra    DoSprites
  2224.  
  2225. ; Nur Hintergrund
  2226.         CNOP    0,4
  2227. EOnlyBack    move.b    d7,(a1)+
  2228.         move.b    d7,(a1)+
  2229.         move.b    d7,(a1)+
  2230.         move.b    d7,(a1)+
  2231.         move.b    d7,(a1)+
  2232.         move.b    d7,(a1)+
  2233.         move.b    d7,(a1)+
  2234.         move.b    d7,(a1)+
  2235.         clr.l    (a6)+
  2236.         clr.l    (a6)+
  2237.         dbra    d1,CharELoop
  2238.         move.b    d7,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  2239.         move.w    CURRENTRASTER(a4),d7    ;d7 wurde zerstört
  2240.         bra    DoSprites
  2241.  
  2242. *
  2243. * Standard-BitMap: Grafikdaten holen und darstellen
  2244. *
  2245.  
  2246. BitMapStd    move.l    BITMAPBASE(a4),a0 ;a0: Bitmap-Basis
  2247.         move.w    VCCOUNT(a4),d0    ;VC holen
  2248.         lsl.w    #3,d0        ;*8
  2249.         add.w    RC(a4),d0    ;RC dazunehmen
  2250.         add.w    d0,a0        ;und zur Bitmap-Basis dazunehmen
  2251.  
  2252.         add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  2253.  
  2254.         move.w    LASTBKGD(a4),d0    ;Letzter Hintergrund, wenn X-Scroll>0
  2255.         move.b    LASTBKGD(a4),d0
  2256.  
  2257.         move.w    d0,Col40XStart(a5)
  2258.         move.w    d0,Col40XStart+2(a5)
  2259.         move.w    d0,Col40XStart+4(a5)
  2260.         move.w    d0,Col40XStart+6(a5)
  2261.  
  2262. ; Schleife für 40 Bytes
  2263.         moveq    #39,d1        ;d1: Zeichenzähler
  2264. BitMapLoop    move.b    (a2)+,d2    ;Farbe holen
  2265.         move.b    d2,d3        ;d3: Hintergrundfarbe
  2266.         move.b    (a0),d0        ;Byte holen
  2267.         beq    BOnlyBack
  2268.         lsr.b    #4,d2        ;d2: Vordergrundfarbe
  2269.  
  2270. ; 8 Pixel konvertieren
  2271.         moveq    #7,d6
  2272. 10$        add.b    d0,d0
  2273.         bcc    11$
  2274.         move.b    d2,(a1)+
  2275.         st.b    (a6)+
  2276.         bra    12$
  2277. 11$        move.b    d3,(a1)+
  2278.         clr.b    (a6)+
  2279. 12$        dbra    d6,10$
  2280.  
  2281.         addq.l    #8,a0        ;Quellzeiger erhöhen
  2282.         dbra    d1,BitMapLoop
  2283.  
  2284.         move.b    d3,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  2285.         bra    DoSprites
  2286.  
  2287. ; Nur Hintergrund
  2288.         CNOP    0,4
  2289. BOnlyBack    move.b    d3,(a1)+
  2290.         move.b    d3,(a1)+
  2291.         move.b    d3,(a1)+
  2292.         move.b    d3,(a1)+
  2293.         move.b    d3,(a1)+
  2294.         move.b    d3,(a1)+
  2295.         move.b    d3,(a1)+
  2296.         move.b    d3,(a1)+
  2297.         clr.l    (a6)+
  2298.         clr.l    (a6)+
  2299.         addq.l    #8,a0        ;Quellzeiger erhöhen
  2300.         dbra    d1,BitMapLoop
  2301.         move.b    d3,LASTBKGD(a4)    ;Letzte Hintergrundfarbe merken
  2302.         bra    DoSprites
  2303.  
  2304. *
  2305. * Multicolor-Bitmap: Grafikdaten holen und darstellen
  2306. *
  2307.  
  2308. BitMapMulti    move.l    BITMAPBASE(a4),a0 ;a0: Bitmap-Basis
  2309.         move.w    VCCOUNT(a4),d0    ;VC holen
  2310.         lsl.w    #3,d0        ;*8
  2311.         add.w    RC(a4),d0    ;RC dazunehmen
  2312.         add.w    d0,a0        ;und zur Bitmap-Basis dazunehmen
  2313.  
  2314.         add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  2315.  
  2316.         move.l    BACK0LONG(a4),d5 ;d5.w: Farbe 0
  2317.  
  2318.         move.l    d5,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  2319.         move.l    d5,Col40XStart+4(a5)
  2320.  
  2321. ; Schleife für 40 Bytes
  2322.         moveq    #39,d1
  2323. BitMapMLoop    move.b    (a2)+,d2    ;Farbe 1/2 holen
  2324.         move.b    (a0),d0        ;Byte holen
  2325.         beq    BMOnlyBack
  2326.         move.b    d2,d3        ;d3.b: Farbe 2
  2327.         lsr.b    #4,d2        ;d2.b: Farbe 1
  2328.         move.b    (a3)+,d4    ;d4.b: Farbe 3
  2329.  
  2330. ; 4 Pixel konvertieren
  2331.         moveq    #3,d6
  2332. 10$        add.b    d0,d0
  2333.         bcc    11$
  2334.         add.b    d0,d0
  2335.         bcc    12$
  2336.         move.b    d4,(a1)+    ;11
  2337.         move.b    d4,(a1)+
  2338.         st.b    (a6)+
  2339.         st.b    (a6)+
  2340.         bra    14$
  2341. 12$        move.b    d3,(a1)+    ;10
  2342.         move.b    d3,(a1)+
  2343.         st.b    (a6)+
  2344.         st.b    (a6)+
  2345.         bra    14$
  2346. 11$        clr.w    (a6)+
  2347.         add.b    d0,d0
  2348.         bcc    13$
  2349.         move.b    d2,(a1)+    ;01
  2350.         move.b    d2,(a1)+
  2351.         bra    14$
  2352. 13$        move.w    d5,(a1)+    ;00
  2353. 14$        dbra    d6,10$
  2354.  
  2355.         addq.l    #8,a0        ;Quellzeiger erhöhen
  2356.         dbra    d1,BitMapMLoop
  2357.         bra    DoSprites
  2358.  
  2359. ; Nur Hintergrund
  2360.         CNOP    0,4
  2361. BMOnlyBack    move.l    d5,(a1)+
  2362.         move.l    d5,(a1)+
  2363.         clr.l    (a6)+
  2364.         clr.l    (a6)+
  2365.         addq.w    #1,a3        ;Farb-RAM-Byte überspringen
  2366.         addq.l    #8,a0        ;Quellzeiger erhöhen
  2367.         dbra    d1,BitMapMLoop
  2368.         bra    DoSprites
  2369.  
  2370. *
  2371. * Ungültiger Darstellungsmodus: Schwarzen Bildschirm anzeigen
  2372. *
  2373.  
  2374. BlackScreen    add.w    #40,VCCOUNT(a4)    ;VC erhöhen
  2375.  
  2376.         moveq    #39,d0        ;40 Zeichen schwarz
  2377. 1$        clr.l    (a1)+
  2378.         clr.l    (a1)+
  2379.         clr.l    (a6)+
  2380.         clr.l    (a6)+
  2381.         dbra    d0,1$
  2382.         bra    DoSprites
  2383.  
  2384. *
  2385. * $3FFF darstellen
  2386. *
  2387.  
  2388. Show3FFF    move.l    BACK0LONG(a4),d3 ;d3.w: Hintergrundfarbe
  2389.  
  2390.         move.l    d3,Col40XStart(a5) ;Hintergrund, wenn X-Scroll>0
  2391.         move.l    d3,Col40XStart+4(a5)
  2392.  
  2393.         btst    #6,CTRL1(a4)
  2394.         bne    11$
  2395.         move.w    #$3fff,d0    ;Byte bei $3FFF lesen
  2396.         bra    12$
  2397. 11$        move.w    #$39ff,d0    ;ECM: Byte bei $39FF lesen
  2398. 12$        GetPhysical
  2399.         move.b    (a0),d0        ;Byte lesen
  2400.  
  2401. ; 4 Pixel nach d1 konvertieren, 0: Hintergrund, 1: schwarz
  2402.         moveq    #0,d1
  2403.         add.b    d0,d0
  2404.         bcs    1$
  2405.         move.b    d3,d1
  2406. 1$        lsl.w    #8,d1
  2407.         add.b    d0,d0
  2408.         bcs    2$
  2409.         move.b    d3,d1
  2410. 2$        lsl.l    #8,d1
  2411.         add.b    d0,d0
  2412.         bcs    3$
  2413.         move.b    d3,d1
  2414. 3$        lsl.l    #8,d1
  2415.         add.b    d0,d0
  2416.         bcs    4$
  2417.         move.b    d3,d1
  2418. 4$
  2419.  
  2420. ; 4 Pixel nach d2 konvertieren
  2421.         moveq    #0,d2
  2422.         add.b    d0,d0
  2423.         bcs    5$
  2424.         move.b    d3,d2
  2425. 5$        lsl.w    #8,d2
  2426.         add.b    d0,d0
  2427.         bcs    6$
  2428.         move.b    d3,d2
  2429. 6$        lsl.l    #8,d2
  2430.         add.b    d0,d0
  2431.         bcs    7$
  2432.         move.b    d3,d2
  2433. 7$        lsl.l    #8,d2
  2434.         add.b    d0,d0
  2435.         bcs    8$
  2436.         move.b    d3,d2
  2437. 8$
  2438.  
  2439. ; Zeile schreiben
  2440.         moveq    #39,d0        ;d0: Bytezähler
  2441. Loop3FFF    move.l    d1,(a1)+
  2442.         move.l    d2,(a1)+
  2443.         clr.l    (a6)+        ;Falsch!!
  2444.         clr.l    (a6)+
  2445.         dbra    d0,Loop3FFF
  2446.  
  2447. *
  2448. * Sprites malen?
  2449. *
  2450.  
  2451. DoSprites    tst.b    SPRITEON(a4)    ;Ist überhaupt ein Sprite z.Z. sichtbar?
  2452.         beq    DrawLRBorder    ;Nein, dann Rahmen
  2453.  
  2454. *
  2455. * Mindestens ein Sprite ist sichtbar, Sprites malen
  2456. *
  2457.  
  2458. ; Kollisions-Puffer löschen
  2459.         lea    SprCollBuf,a0
  2460.         moveq    #DisplayX/4-1,d0
  2461. 1$        clr.l    (a0)+
  2462.         dbra    d0,1$
  2463.  
  2464. ; Sprites malen
  2465.         moveq    #0,d4        ;Sprite-Grafik Kollisionsflag
  2466.         moveq    #0,d5        ;Sprite-Sprite Kollisionsflag
  2467.         DoSprite 0
  2468.         DoSprite 1
  2469.         DoSprite 2
  2470.         DoSprite 3
  2471.         DoSprite 4
  2472.         DoSprite 5
  2473.         DoSprite 6
  2474.         DoSprite 7
  2475.         move.w    CURRENTRASTER(a4),d7    ;d7 wurde zerstört
  2476.  
  2477. ; Kollisions-Flags auswerten
  2478.         tst.w    Collisions
  2479.         beq    DrawLRBorder
  2480.  
  2481.         move.b    CLXSPR(a4),d0
  2482.         or.b    d5,CLXSPR(a4)    ;Bits im Kollisionsregister setzen
  2483.         tst.b    d0        ;Haben bereits Kollisionen stattgefunden?
  2484.         bne    2$
  2485.         or.b    #$04,IRQFLAG(a4) ;Nein, IMMC-Bit setzen
  2486.         btst    #2,IRQMASK(a4)    ;IRQ erlaubt?
  2487.         beq    2$
  2488.         or.b    #$80,IRQFLAG(a4) ;Ja, IRQ-Bit setzen
  2489.         st.b    IntIsVICIRQ    ;Und Interrupt auslösen
  2490.  
  2491. 2$        move.b    CLXBGR(a4),d0
  2492.         or.b    d4,CLXBGR(a4)
  2493.         tst.b    d0
  2494.         bne    DrawLRBorder
  2495.         or.b    #$02,IRQFLAG(a4)
  2496.         btst    #1,IRQMASK(a4)
  2497.         beq    DrawLRBorder
  2498.         or.b    #$80,IRQFLAG(a4)
  2499.         st.b    IntIsVICIRQ
  2500.  
  2501. *
  2502. * Linken und rechten Rahmen zeichnen
  2503. *
  2504.  
  2505. ; 40-Spalten-Rahmen
  2506. DrawLRBorder    move.l    a5,a0
  2507.         move.l    BORDERLONG(a4),d0 ;d0.l: Rahmenfarbe
  2508.  
  2509.         move.l    d0,(a0)+    ;Links: $00..$17
  2510.         move.l    d0,(a0)+
  2511.         move.l    d0,(a0)+
  2512.         move.l    d0,(a0)+
  2513.         move.l    d0,(a0)+
  2514.         move.l    d0,(a0)+
  2515.  
  2516.         lea    Col40XStop-Col40XStart(a0),a0
  2517.         move.l    d0,(a0)+    ;Rechts: $158..$16f
  2518.         move.l    d0,(a0)+
  2519.         move.l    d0,(a0)+
  2520.         move.l    d0,(a0)+
  2521.         move.l    d0,(a0)+
  2522.         move.l    d0,(a0)
  2523.  
  2524. ; 38-Spalten-Rahmen nach (a5) (Puffer oder Bitmap)
  2525.         tst.b    IS38COL(a4)
  2526.         beq    1$
  2527.  
  2528.         lea    Col40XStart(a5),a0
  2529.         move.l    d0,(a0)+    ;Links: $18..$1e
  2530.         move.w    d0,(a0)+
  2531.         move.b    d0,(a0)
  2532.  
  2533.         lea    Col38XStop(a5),a0
  2534.         move.b    d0,(a0)+    ;Rechts: $14f..$157
  2535.         move.l    d0,(a0)+
  2536.         move.l    d0,(a0)+
  2537. 1$
  2538.  
  2539. *
  2540. * Ende einer sichtbaren Zeile: Bei EGS/Picasso Zeile in die Karte schreiben.
  2541. * Es wird nur der Bereich zwischen Col40XStart und Col40XStop geschrieben,
  2542. * der Rest ist immer Rahmen und der wird in DrawLRBorder direkt in die
  2543. * Bitmap geschrieben.
  2544. *
  2545.  
  2546. VICNext        cmp.w    #STYP_AMIGA,ScreenType
  2547.         beq    VICIncA5
  2548.         cmp.w    #STYP_CYBER,ScreenType
  2549.         beq    VICNextCyber
  2550. VICNextCopyLine    move.l    CURRENTA5(a4),a1
  2551.         lea    LineStore,a0
  2552.         moveq    #DisplayX/4-1,d0
  2553. 1$        move.l    (a0)+,(a1)+
  2554.         dbra    d0,1$
  2555.         bra    VICIncA5
  2556.  
  2557. VICNextCyber    tst.l    TurboCyber
  2558.         bne    VICNextCopyLine
  2559.         move.l    _CyberGfxBase,a6
  2560.         lea    CyberHook,a0
  2561.         move.l    TheRastPort,a1
  2562.         sub.l    a2,a2
  2563.         jsr    DoCDrawMethod(a6)
  2564.         bra    VICIncRC    ;a5 nicht erhöhen (zeigt auf LineStore)!
  2565.  
  2566. CyberHookProc    move.l    (a1),a0        ;a0: Adresse des Bildschirmspeichers
  2567.         moveq    #0,d0
  2568.         move.w    20(a1),d0    ;!!
  2569.         move.w    Registers+CURRENTRASTER,d1
  2570.         sub.w    #FirstDispLine,d1
  2571.         mulu.w    d1,d0
  2572.         add.l    d0,a0
  2573.         lea    LineStore,a1
  2574.         moveq    #DisplayX/4-1,d0
  2575. 1$        move.l    (a1)+,(a0)+
  2576.         dbra    d0,1$
  2577.         rts
  2578.  
  2579. *
  2580. * Bild wird übersprungen, nur Bad-Line-Zyklen berechnen
  2581. *
  2582.  
  2583. VICSkip        cmp.w    #FirstDMALine,d7 ;Innerhalb des DMA-Bereiches?
  2584.         blo    VICNop
  2585.         cmp.w    #LastDMALine,d7
  2586.         bhi    VICNop
  2587.  
  2588.         move.b    d7,d0        ;Ja, stimmen die unteren Bits
  2589.         and.b    #7,d0        ;der Rasterzeile mit dem Y-Scroll
  2590.         cmp.b    YSCROLL+1(a4),d0 ;überein?
  2591.         bne    VICNop
  2592.  
  2593.         move.w    BadLineCycles,CyclesLeft
  2594.         bra    VICNop
  2595.  
  2596. *
  2597. * Zeiger in Bitmap erhöhen
  2598. *
  2599.  
  2600. VICIncA5    moveq    #0,d0
  2601.         move.w    ScreenX,d0
  2602.         add.l    d0,CURRENTA5(a4)
  2603.  
  2604. *
  2605. * RC erhöhen, Darstellung abschalten, wenn gleich 7
  2606. * (braucht nur im sichtbaren Bereich zu geschehen)
  2607. *
  2608.  
  2609. VICIncRC    cmp.w    #7,RC(a4)
  2610.         beq    1$
  2611.         addq.w    #1,RC(a4)
  2612.         bra    2$
  2613. 1$        st.b    DISPLAYOFF(a4)
  2614.         move.w    VCCOUNT(a4),VCBASE(a4)
  2615. 2$
  2616.  
  2617. *
  2618. * MCs erhöhen (muß in jeder Rasterzeile geschehen, damit die Sprites
  2619. *  auch im Overscan-Bereich korrekt dargestellt werden)
  2620. *
  2621.  
  2622. ; Wenn alle Sprites aus sind, direkt zu CIA-Periodic springen
  2623. VICNop        lea    SPRITEON(a4),a3
  2624.         move.b    (a3),d0
  2625.         or.b    SPREN(a4),d0
  2626.         beq    Periodic6526
  2627.  
  2628. ; MC für jedes Sprite zählen (7..0)
  2629.         moveq    #7,d6        ;d6: Spritenummer
  2630.         lea    M7Y(a4),a1    ;a1: Zeiger auf erste Y-Koordinate
  2631.         lea    MC7(a4),a2    ;a2: Zeiger auf MC
  2632.  
  2633. MCLoop        move.b    (a1),d0        ;Y-Koordinate
  2634.         btst    d6,SPREN(a4)    ;Sprite angeschaltet?
  2635.         bne    1$
  2636. 3$        cmp.w    #60,(a2)    ;Nein, MC kleiner als 60?
  2637.         blo    2$
  2638.         bclr    d6,(a3)        ;Nein, Sprite nicht mehr darstellen
  2639.         bra    5$
  2640.  
  2641. 1$        cmp.b    d0,d7        ;Sprite angeschaltet, Y-Koord. mit
  2642.         bne    3$
  2643.         clr.w    (a2)        ;Gleich, MC zurücksetzen
  2644.         bset    d6,(a3)        ;Und Sprite ab jetzt darstellen
  2645.         bra    5$
  2646.  
  2647. 2$        btst    d6,MYE(a4)    ;MC kleiner als 60, Sprite Y-expandiert?
  2648.         beq    4$
  2649.         eor.b    d7,d0        ;Ja, nur erhöhen, wenn Bit 0
  2650.         and.b    #$01,d0        ; der Y-Koordinate gleich Bit 0
  2651.         bne    5$        ; des Rasterzählers ist
  2652. 4$        addq.w    #3,(a2)        ;MC erhöhen
  2653.         subq.w    #2,CyclesLeft    ;2 Zyklen vom 6510 abziehen
  2654.  
  2655. 5$        subq.w    #2,a1        ;Zeiger auf Y-Koordinate erhöhen
  2656.         subq.w    #2,a2        ;Zeiger auf MC erhöhen
  2657.         dbra    d6,MCLoop
  2658.  
  2659. ; Zu CIA-Periodic springen
  2660.         bra    Periodic6526
  2661.  
  2662.  
  2663. **
  2664. ** Ein Sprite zeichnen
  2665. ** d0.l: Spritedaten
  2666. ** d1.w: X-Koordinate
  2667. ** d2.b: Spritefarbe
  2668. ** d3  : (Temp.)
  2669. ** d4.b: Kollisionsergebnis Sprite-Hintergrund
  2670. ** d5.b: Kollisionsergebnis Sprite-Sprite
  2671. ** d6  : (Pixelzähler)
  2672. ** d7.b: Sprite-Bit (1,2,4, ...)
  2673. ** a1  : Ziel im Bildschirmspeicher
  2674. ** a2  : Ziel im Kollisionspuffer
  2675. ** a3  : Zeiger auf Grafik-Kollisionspuffer
  2676. **
  2677.  
  2678.         CNOP    0,4
  2679. ; Standard-Sprite: 3 Byte mit je 8 Pixeln konvertieren
  2680. DrawSprStd    cmp.w    #DisplayX-24,d1    ;Sprite horizontal sichtbar?
  2681.         bhs    DSSRts
  2682.  
  2683.         moveq    #0,d6        ;Pixelzähler
  2684. DSSLoop        add.l    d0,d0        ;Pixel gesetzt?
  2685.         bcc    DSSNext
  2686.  
  2687.         tst.b    (a3,d6.w)    ;Ist hier schon Grafik?
  2688.         beq    1$
  2689.         or.b    d7,d4        ;Ja, Kollision erkannt
  2690.  
  2691. 1$        move.b    (a2,d6.w),d1    ;Ist schon ein Sprite da?
  2692.         bne    DSSDont
  2693.  
  2694.         move.b    d2,(a1,d6.w)    ;Nein, Punkt setzen
  2695.         move.b    d7,(a2,d6.w)
  2696.         bra    DSSNext
  2697.  
  2698. DSSDont        or.b    d1,d5        ;Ja, Kollision erkannt zwischen bestehendem
  2699.         or.b    d7,d5        ; und aktuellem Sprite
  2700.  
  2701. DSSNext        addq.w    #1,d6
  2702.         cmp.w    #24,d6
  2703.         bne    DSSLoop
  2704. DSSRts        rts
  2705.  
  2706.         CNOP    0,4
  2707. ; X-expandiertes Standard-Sprite: 3 Byte mit je 8 Pixeln konvertieren
  2708. DrawSprStdExp    cmp.w    #DisplayX-48,d1
  2709.         bhs    DSSERts
  2710.  
  2711.         moveq    #0,d6
  2712. DSSELoop    add.l    d0,d0
  2713.         bcc    DSSENext
  2714.  
  2715.         tst.b    (a3,d6.w)
  2716.         beq    1$
  2717.         or.b    d7,d4
  2718.  
  2719. 1$        move.b    (a2,d6.w),d1
  2720.         bne    DSSEDont1st
  2721.  
  2722.         move.b    d2,(a1,d6.w)
  2723.         move.b    d7,(a2,d6.w)
  2724.         bra    DSSETest2nd
  2725.  
  2726. DSSEDont1st    or.b    d1,d5
  2727.         or.b    d7,d5
  2728.  
  2729. DSSETest2nd    tst.b    1(a3,d6.w)
  2730.         beq    1$
  2731.         or.b    d7,d4
  2732.  
  2733. 1$        move.b    1(a2,d6.w),d1
  2734.         bne    DSSEDont2nd
  2735.  
  2736.         move.b    d2,1(a1,d6.w)
  2737.         move.b    d7,1(a2,d6.w)
  2738.         bra    DSSENext
  2739.  
  2740. DSSEDont2nd    or.b    d1,d5
  2741.         or.b    d7,d5
  2742.  
  2743. DSSENext    addq.w    #2,d6
  2744.         cmp.w    #48,d6
  2745.         bne    DSSELoop
  2746. DSSERts        rts
  2747.  
  2748.         CNOP    0,4
  2749. ; Multicolor-Sprite: 3 Byte mit je 4 Pixeln konvertieren
  2750. DrawSprMulti    cmp.w    #DisplayX-24,d1
  2751.         bhs    DSMRts
  2752.  
  2753.         moveq    #0,d6
  2754. DSMLoop        add.l    d0,d0        ;Farbe des Pixels bestimmen
  2755.         bcc    DSMFirstIs0
  2756.         add.l    d0,d0
  2757.         bcc    DSMDraw10
  2758.         move.b    $26(a4),d3    ;11
  2759.         bra    DSMDraw
  2760. DSMDraw10    move.b    d2,d3        ;10
  2761.         bra    DSMDraw
  2762. DSMFirstIs0    add.l    d0,d0
  2763.         bcc    DSMNext
  2764.         move.b    $25(a4),d3    ;01
  2765.  
  2766. DSMDraw        tst.b    (a3,d6.w)
  2767.         beq    1$
  2768.         or.b    d7,d4
  2769.  
  2770. 1$        move.b    (a2,d6.w),d1
  2771.         bne    DSMDont1st
  2772.  
  2773.         move.b    d3,(a1,d6.w)
  2774.         move.b    d7,(a2,d6.w)
  2775.         bra    DSMTest2nd
  2776.  
  2777. DSMDont1st    or.b    d1,d5
  2778.         or.b    d7,d5
  2779.  
  2780. DSMTest2nd    tst.b    1(a3,d6.w)
  2781.         beq    1$
  2782.         or.b    d7,d4
  2783.  
  2784. 1$        move.b    1(a2,d6.w),d1
  2785.         bne    DSMDont2nd
  2786.  
  2787.         move.b    d3,1(a1,d6.w)
  2788.         move.b    d7,1(a2,d6.w)
  2789.         bra    DSMNext
  2790.  
  2791. DSMDont2nd    or.b    d1,d5
  2792.         or.b    d7,d5
  2793.  
  2794. DSMNext        addq.w    #2,d6
  2795.         cmp.w    #24,d6
  2796.         bne    DSMLoop
  2797. DSMRts        rts
  2798.  
  2799.         CNOP    0,4
  2800. ; X-expandiertes Multicolor-Sprite: 3 Byte mit je 4 Pixeln konvertieren
  2801. DrawSprMultiExp    cmp.w    #DisplayX-48,d1
  2802.         bhs    DSMERts
  2803.  
  2804.         moveq    #0,d6
  2805. DSMELoop    add.l    d0,d0
  2806.         bcc    DSMEFirstIs0
  2807.         add.l    d0,d0
  2808.         bcc    DSMEDraw10
  2809.         move.b    $26(a4),d3    ;11
  2810.         bra    DSMEDraw
  2811. DSMEDraw10    move.b    d2,d3        ;10
  2812.         bra    DSMEDraw
  2813. DSMEFirstIs0    add.l    d0,d0
  2814.         bcc    DSMENext
  2815.         move.b    $25(a4),d3    ;01
  2816.  
  2817. DSMEDraw    tst.b    (a3,d6.w)
  2818.         beq    1$
  2819.         or.b    d7,d4
  2820.  
  2821. 1$        move.b    (a2,d6.w),d1
  2822.         bne    DSMEDont1st
  2823.  
  2824.         move.b    d3,(a1,d6.w)
  2825.         move.b    d7,(a2,d6.w)
  2826.         bra    DSMETest2nd
  2827.  
  2828. DSMEDont1st    or.b    d1,d5
  2829.         or.b    d7,d5
  2830.  
  2831. DSMETest2nd    tst.b    1(a3,d6.w)
  2832.         beq    1$
  2833.         or.b    d7,d4
  2834.  
  2835. 1$        move.b    1(a2,d6.w),d1
  2836.         bne    DSMEDont2nd
  2837.  
  2838.         move.b    d3,1(a1,d6.w)
  2839.         move.b    d7,1(a2,d6.w)
  2840.         bra    DSMETest3rd
  2841.  
  2842. DSMEDont2nd    or.b    d1,d5
  2843.         or.b    d7,d5
  2844.  
  2845. DSMETest3rd    tst.b    2(a3,d6.w)
  2846.         beq    1$
  2847.         or.b    d7,d4
  2848.  
  2849. 1$        move.b    2(a2,d6.w),d1
  2850.         bne    DSMEDont3rd
  2851.  
  2852.         move.b    d3,2(a1,d6.w)
  2853.         move.b    d7,2(a2,d6.w)
  2854.         bra    DSMETest4th
  2855.  
  2856. DSMEDont3rd    or.b    d1,d5
  2857.         or.b    d7,d5
  2858.  
  2859. DSMETest4th    tst.b    3(a3,d6.w)
  2860.         beq    1$
  2861.         or.b    d7,d4
  2862.  
  2863. 1$        move.b    3(a2,d6.w),d1
  2864.         bne    DSMEDont4th
  2865.  
  2866.         move.b    d3,3(a1,d6.w)
  2867.         move.b    d7,3(a2,d6.w)
  2868.         bra    DSMENext
  2869.  
  2870. DSMEDont4th    or.b    d1,d5
  2871.         or.b    d7,d5
  2872.  
  2873. DSMENext    addq.w    #4,d6
  2874.         cmp.w    #48,d6
  2875.         bne    DSMELoop
  2876. DSMERts        rts
  2877.  
  2878.         CNOP    0,4
  2879. ; Standard-Sprite im Hintergrund: 3 Byte mit je 8 Pixeln konvertieren
  2880. DrawBackStd    cmp.w    #DisplayX-24,d1    ;Sprite horizontal sichtbar?
  2881.         bhs    DBSRts
  2882.  
  2883.         moveq    #0,d6        ;Pixelzähler
  2884. DBSLoop        add.l    d0,d0        ;Pixel gesetzt?
  2885.         bcc    DBSNext
  2886.  
  2887.         tst.b    (a3,d6.w)    ;Ist hier schon Grafik?
  2888.         beq    1$
  2889.         or.b    d7,d4        ;Ja, Kollision erkannt
  2890.         move.b    (a2,d6.w),d1    ;Ist schon ein Sprite da?
  2891.         beq    DBSNext
  2892.         or.b    d1,d5        ;Ja, Kollision erkannt
  2893.         or.b    d7,d5
  2894.         bra    DBSNext        ;Sprite nicht zeichnen
  2895.  
  2896. 1$        move.b    (a2,d6.w),d1    ;Ja, ist schon ein Sprite da?
  2897.         bne    DBSDont
  2898.  
  2899.         move.b    d2,(a1,d6.w)    ;Nein, Punkt setzen
  2900.         move.b    d7,(a2,d6.w)
  2901.         bra    DBSNext
  2902.  
  2903. DBSDont        or.b    d1,d5        ;Ja, Kollision erkannt zwischen bestehendem
  2904.         or.b    d7,d5        ; und aktuellem Sprite
  2905.  
  2906. DBSNext        addq.w    #1,d6
  2907.         cmp.w    #24,d6
  2908.         bne    DBSLoop
  2909. DBSRts        rts
  2910.  
  2911.         CNOP    0,4
  2912. ; X-expandiertes Standard-Sprite im Hintergrund: 3 Byte mit je 8 Pixeln konvertieren
  2913. DrawBackStdExp    cmp.w    #DisplayX-48,d1
  2914.         bhs    DBSERts
  2915.  
  2916.         moveq    #0,d6
  2917. DBSELoop    add.l    d0,d0
  2918.         bcc    DBSENext
  2919.  
  2920.         tst.b    (a3,d6.w)
  2921.         beq    1$
  2922.         or.b    d7,d4
  2923.         move.b    (a2,d6.w),d1
  2924.         beq    DBSETest2nd
  2925.         or.b    d1,d5
  2926.         or.b    d7,d5
  2927.         bra    DBSETest2nd
  2928.  
  2929. 1$        move.b    (a2,d6.w),d1
  2930.         bne    DBSEDont1st
  2931.  
  2932.         move.b    d2,(a1,d6.w)
  2933.         move.b    d7,(a2,d6.w)
  2934.         bra    DBSETest2nd
  2935.  
  2936. DBSEDont1st    or.b    d1,d5
  2937.         or.b    d7,d5
  2938.  
  2939. DBSETest2nd    tst.b    1(a3,d6.w)
  2940.         beq    1$
  2941.         or.b    d7,d4
  2942.         move.b    1(a2,d6.w),d1
  2943.         beq    DBSENext
  2944.         or.b    d1,d5
  2945.         or.b    d7,d5
  2946.         bra    DBSENext
  2947.  
  2948. 1$        move.b    1(a2,d6.w),d1
  2949.         bne    DBSEDont2nd
  2950.  
  2951.         move.b    d2,1(a1,d6.w)
  2952.         move.b    d7,1(a2,d6.w)
  2953.         bra    DBSENext
  2954.  
  2955. DBSEDont2nd    or.b    d1,d5
  2956.         or.b    d7,d5
  2957.  
  2958. DBSENext    addq.w    #2,d6
  2959.         cmp.w    #48,d6
  2960.         bne    DBSELoop
  2961. DBSERts        rts
  2962.  
  2963.         CNOP    0,4
  2964. ; Multicolor-Sprite im Hintergrund: 3 Byte mit je 4 Pixeln konvertieren
  2965. DrawBackMulti    cmp.w    #DisplayX-24,d1
  2966.         bhs    DBMRts
  2967.  
  2968.         moveq    #0,d6
  2969. DBMLoop        add.l    d0,d0        ;Farbe des Pixels bestimmen
  2970.         bcc    DBMFirstIs0
  2971.         add.l    d0,d0
  2972.         bcc    DBMDraw10
  2973.         move.b    $26(a4),d3    ;11
  2974.         bra    DBMDraw
  2975. DBMDraw10    move.b    d2,d3        ;10
  2976.         bra    DBMDraw
  2977. DBMFirstIs0    add.l    d0,d0
  2978.         bcc    DBMNext
  2979.         move.b    $25(a4),d3    ;01
  2980.  
  2981. DBMDraw        tst.b    (a3,d6.w)
  2982.         beq    1$
  2983.         or.b    d7,d4
  2984.         move.b    (a2,d6.w),d1
  2985.         beq    DBMTest2nd
  2986.         or.b    d1,d5
  2987.         or.b    d7,d5
  2988.         bra    DBMTest2nd
  2989.  
  2990. 1$        move.b    (a2,d6.w),d1
  2991.         bne    DBMDont1st
  2992.  
  2993.         move.b    d3,(a1,d6.w)
  2994.         move.b    d7,(a2,d6.w)
  2995.         bra    DBMTest2nd
  2996.  
  2997. DBMDont1st    or.b    d1,d5
  2998.         or.b    d7,d5
  2999.  
  3000. DBMTest2nd    tst.b    1(a3,d6.w)
  3001.         beq    1$
  3002.         or.b    d7,d4
  3003.         move.b    1(a2,d6.w),d1
  3004.         beq    DBMNext
  3005.         or.b    d1,d5
  3006.         or.b    d7,d5
  3007.         bra    DBMNext
  3008.  
  3009. 1$        move.b    1(a2,d6.w),d1
  3010.         bne    DBMDont2nd
  3011.  
  3012.         move.b    d3,1(a1,d6.w)
  3013.         move.b    d7,1(a2,d6.w)
  3014.         bra    DBMNext
  3015.  
  3016. DBMDont2nd    or.b    d1,d5
  3017.         or.b    d7,d5
  3018.  
  3019. DBMNext        addq.w    #2,d6
  3020.         cmp.w    #24,d6
  3021.         bne    DBMLoop
  3022. DBMRts        rts
  3023.  
  3024.         CNOP    0,4
  3025. ; X-expandiertes Multicolor-Sprite im Hintergrund: 3 Byte mit je 4 Pixeln konvertieren
  3026. DrawBackMultiExp cmp.w    #DisplayX-48,d1
  3027.         bhs    DBMERts
  3028.  
  3029.         moveq    #0,d6
  3030. DBMELoop    add.l    d0,d0
  3031.         bcc    DBMEFirstIs0
  3032.         add.l    d0,d0
  3033.         bcc    DBMEDraw10
  3034.         move.b    $26(a4),d3    ;11
  3035.         bra    DBMEDraw
  3036. DBMEDraw10    move.b    d2,d3        ;10
  3037.         bra    DBMEDraw
  3038. DBMEFirstIs0    add.l    d0,d0
  3039.         bcc    DBMENext
  3040.         move.b    $25(a4),d3    ;01
  3041.  
  3042. DBMEDraw    tst.b    (a3,d6.w)
  3043.         beq    1$
  3044.         or.b    d7,d4
  3045.         move.b    (a2,d6.w),d1
  3046.         beq    DBMETest2nd
  3047.         or.b    d1,d5
  3048.         or.b    d7,d5
  3049.         bra    DBMETest2nd
  3050.  
  3051. 1$        move.b    (a2,d6.w),d1
  3052.         bne    DBMEDont1st
  3053.  
  3054.         move.b    d3,(a1,d6.w)
  3055.         move.b    d7,(a2,d6.w)
  3056.         bra    DBMETest2nd
  3057.  
  3058. DBMEDont1st    or.b    d1,d5
  3059.         or.b    d7,d5
  3060.  
  3061. DBMETest2nd    tst.b    1(a3,d6.w)
  3062.         beq    1$
  3063.         or.b    d7,d4
  3064.         move.b    1(a2,d6.w),d1
  3065.         beq    DBMETest3rd
  3066.         or.b    d1,d5
  3067.         or.b    d7,d5
  3068.         bra    DBMETest3rd
  3069.  
  3070. 1$        move.b    1(a2,d6.w),d1
  3071.         bne    DBMEDont2nd
  3072.  
  3073.         move.b    d3,1(a1,d6.w)
  3074.         move.b    d7,1(a2,d6.w)
  3075.         bra    DBMETest3rd
  3076.  
  3077. DBMEDont2nd    or.b    d1,d5
  3078.         or.b    d7,d5
  3079.  
  3080. DBMETest3rd    tst.b    2(a3,d6.w)
  3081.         beq    1$
  3082.         or.b    d7,d4
  3083.         move.b    2(a2,d6.w),d1
  3084.         beq    DBMETest4th
  3085.         or.b    d1,d5
  3086.         or.b    d7,d5
  3087.         bra    DBMETest4th
  3088.  
  3089. 1$        move.b    2(a2,d6.w),d1
  3090.         bne    DBMEDont3rd
  3091.  
  3092.         move.b    d3,2(a1,d6.w)
  3093.         move.b    d7,2(a2,d6.w)
  3094.         bra    DBMETest4th
  3095.  
  3096. DBMEDont3rd    or.b    d1,d5
  3097.         or.b    d7,d5
  3098.  
  3099. DBMETest4th    tst.b    3(a3,d6.w)
  3100.         beq    1$
  3101.         or.b    d7,d4
  3102.         move.b    3(a2,d6.w),d1
  3103.         beq    DBMENext
  3104.         or.b    d1,d5
  3105.         or.b    d7,d5
  3106.         bra    DBMENext
  3107.  
  3108. 1$        move.b    3(a2,d6.w),d1
  3109.         bne    DBMEDont4th
  3110.  
  3111.         move.b    d3,3(a1,d6.w)
  3112.         move.b    d7,3(a2,d6.w)
  3113.         bra    DBMENext
  3114.  
  3115. DBMEDont4th    or.b    d1,d5
  3116.         or.b    d7,d5
  3117.  
  3118. DBMENext    addq.w    #4,d6
  3119.         cmp.w    #48,d6
  3120.         bne    DBMELoop
  3121. DBMERts        rts
  3122.  
  3123.  
  3124. **
  3125. ** Amiga-Mono-Routinen einbinden
  3126. **
  3127.  
  3128.         INCLUDE    "6569mono.i"
  3129.  
  3130.  
  3131. **
  3132. ** Konstanten
  3133. **
  3134.  
  3135. ; Strings
  3136. EGSName        dc.b    "egs.library",0
  3137. VilIntuiName    dc.b    "vilintuisup.library",0
  3138. CyberGfxName    dc.b    "cybergraphics.library",0
  3139. HRGSystemName    dc.b    "hrgsystem.library",0
  3140.  
  3141. ; Farbpalette
  3142.         CNOP    0,4
  3143. Palette        dc.b    0,0,0,0        ;Schwarz
  3144.         dc.b    255,255,255,0    ;Weiß
  3145.         dc.b    204,0,0,0    ;Rot
  3146.         dc.b    0,255,204,0    ;Cyan
  3147.         dc.b    255,0,255,0    ;Magenta
  3148.         dc.b    0,204,0,0    ;Grün
  3149.         dc.b    0,0,204,0    ;Blau
  3150.         dc.b    255,255,0,0    ;Gelb
  3151.         dc.b    255,128,0,0    ;Orange
  3152.         dc.b    128,64,0,0    ;Braun
  3153.         dc.b    255,128,128,0    ;Hellrot
  3154.         dc.b    64,64,64,0    ;Dunkelgrau
  3155.         dc.b    128,128,128,0    ;Mittelgrau
  3156.         dc.b    128,255,128,0    ;Hellgrün
  3157.         dc.b    128,128,255,0    ;Hellblau
  3158.         dc.b    192,192,192,0    ;Hellgrau
  3159.  
  3160. ; Tabelle der Display-Routinen (jeweils für Farbe und Monochrom)
  3161. DispProcTab    dc.l    TextStd
  3162.         dc.l    TextMulti
  3163.         dc.l    BitMapStd
  3164.         dc.l    BitMapMulti
  3165.         dc.l    TextECM
  3166.         dc.l    BlackScreen
  3167.         dc.l    BlackScreen
  3168.         dc.l    BlackScreen
  3169.  
  3170. MonoDispProcTab    dc.l    FTextStd
  3171.         dc.l    FTextStd
  3172.         dc.l    FBitMapStd
  3173.         dc.l    FBitMapStd
  3174.         dc.l    FTextStd
  3175.         dc.l    FBlackScreen
  3176.         dc.l    FBlackScreen
  3177.         dc.l    FBlackScreen
  3178.  
  3179. ; Tabelle der Sprite-Display-Routinen
  3180. SpriteProcTab    dc.l    DrawSprStd
  3181.         dc.l    DrawSprStdExp
  3182.         dc.l    DrawSprMulti
  3183.         dc.l    DrawSprMultiExp
  3184.         dc.l    DrawBackStd
  3185.         dc.l    DrawBackStdExp
  3186.         dc.l    DrawBackMulti
  3187.         dc.l    DrawBackMultiExp
  3188.  
  3189.  
  3190. **
  3191. ** Datenbereich
  3192. **
  3193.  
  3194. ; Taglist für den Screen (Amiga)
  3195. ScreenTags    dc.l    SA_DisplayID
  3196. ScreenDID    dc.l    0
  3197.         dc.l    SA_Width,$180    ;Vielfaches von 32
  3198.         dc.l    SA_Height,DisplayY
  3199.         dc.l    SA_Depth,4
  3200.         dc.l    SA_Quiet,-1
  3201.         dc.l    SA_AutoScroll,-1
  3202.         dc.l    SA_Overscan
  3203. ScreenOScan    dc.l    0
  3204.         dc.l    0,0
  3205.  
  3206. ; Taglist für den Screen (Amiga-Mono)
  3207. MonoScreenTags    dc.l    SA_DisplayID
  3208. MonoScreenDID    dc.l    0
  3209.         dc.l    SA_Width,$180
  3210.         dc.l    SA_Height,DisplayY
  3211.         dc.l    SA_Depth,1
  3212.         dc.l    SA_Quiet,-1
  3213.         dc.l    SA_AutoScroll,-1
  3214.         dc.l    SA_Overscan
  3215. MonoScreenOScan    dc.l    0
  3216.         dc.l    0,0
  3217.  
  3218. ; Taglist für den Screen (Cyber)
  3219. CyberScreenTags    dc.l    SA_DisplayID
  3220. CyberScreenDID    dc.l    0
  3221.         dc.l    SA_Width
  3222. CyberScreenX    dc.l    0
  3223.         dc.l    SA_Height
  3224. CyberScreenY    dc.l    0
  3225.         dc.l    SA_Depth,8
  3226.         dc.l    SA_Quiet,-1
  3227.         dc.l    0,0
  3228.  
  3229. ; Taglist für den Screen (Merlin)
  3230. HRGScreenTags    dc.l    HTOS_BitMapType,HRCOL_PACKED8
  3231.         dc.l    HTOS_Width
  3232. HRGScrWidth    dc.l    0
  3233.         dc.l    HTOS_Height
  3234. HRGScrHeight    dc.l    0
  3235.         dc.l    HTOS_Active,-1
  3236.         dc.l    HTOS_MatchModeInfo,-1
  3237.         dc.l    HTOS_EazyScreen,HRES_SIMPLE
  3238.         dc.l    0,0
  3239.  
  3240. ; Taglist für das Fenster (Picasso/Amiga/Cyber)
  3241. WindowTags    dc.l    WA_Left,0
  3242.         dc.l    WA_Top,0
  3243.         dc.l    WA_Width
  3244. WindowWidth    dc.l    0
  3245.         dc.l    WA_Height
  3246. WindowHeight    dc.l    0
  3247.         dc.l    WA_NoCareRefresh,-1
  3248.         dc.l    WA_Borderless,-1
  3249.         dc.l    WA_Activate,-1
  3250.         dc.l    WA_RMBTrap,-1
  3251.         dc.l    WA_CustomScreen
  3252. WindowScreen    dc.l    0
  3253.         dc.l    WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY
  3254.         dc.l    0,0
  3255.  
  3256. ; Struktur für E_OpenScreen (EGS)
  3257. NewEScreen    dc.l    ModeNameBuf+16
  3258.         dc.w    8,0    ;Tiefe 8
  3259.         dc.l    0
  3260.         dc.l    0
  3261.         dc.l    0
  3262.         dc.l    0
  3263.         dc.l    E_eMOUSEBUTTONS|E_eRAWKEY
  3264.         dc.l    0
  3265.  
  3266. ; Taglist für den Screen (Picasso)
  3267. VilTags        dc.l    TAVIS_DM_STRUCT,Dimensions
  3268.         dc.l    TAVIS_DOUBLE_BUFFER,-1
  3269.         dc.l    0,0
  3270.  
  3271. ; VilIntuiSup-Dimensions (Picasso)
  3272. Dimensions    dc.w    0,0,0,0,8,0    ;8: Tiefe
  3273.  
  3274. ; Hook für Cybergraphics
  3275. CyberHook    dc.l    0,0
  3276.         dc.l    CyberHookProc
  3277.         dc.l    0
  3278.         dc.l    0
  3279.  
  3280. ; Variablen
  3281.         CNOP    0,4
  3282. DisplayID    dc.l    0    ;Prefs: DisplayID des Screens
  3283. TheScreen    dc.l    0    ;Screen
  3284. MerlScreen    dc.l    0    ;Merlin-Screen
  3285. TheWindow    dc.l    0    ;Window (Picasso/Amiga/Cyber)
  3286. EGSPort        dc.l    0    ;EDCMP-Port (EGS)
  3287. WindowPort    dc.l    0    ;IDCMP-Port (Amiga/Picasso/Cyber)
  3288. TheRastPort    dc.l    0    ;RastPort (Amiga/Cyber)
  3289. TheViewPort    dc.l    0    ;ViewPort (Amiga/Picasso/Cyber)
  3290. VBlankProc    dc.l    0    ;Zeiger auf VBlank-Routine
  3291. DisplayProc    dc.l    0    ;Zeiger auf die Display-Routine (Text/Bitmap etc.)
  3292.  
  3293. Sprite0Proc    dc.l    0    ;Zeiger auf Display-Routinen für die einzelnen Sprites
  3294. Sprite1Proc    dc.l    0
  3295. Sprite2Proc    dc.l    0
  3296. Sprite3Proc    dc.l    0
  3297. Sprite4Proc    dc.l    0
  3298. Sprite5Proc    dc.l    0
  3299. Sprite6Proc    dc.l    0
  3300. Sprite7Proc    dc.l    0
  3301.  
  3302. InvisibleMap    dc.l    0    ;Zeiger auf unsichtbare BitMap (EGS)
  3303.                 ;Zeiger auf Chunky-Map (Amiga)
  3304.                 ;Zeiger auf Bitplane (AmigaMono ohne DB)
  3305.                 ;Zeiger auf Bildschirmspeicher (TurboCyber)
  3306.                 ;Zeiger auf Bildschirmspeicher (Merlin)
  3307. InvBufNum    dc.l    0    ;Nummer des unsichtbaren Puffers (Amiga/Picasso)
  3308. ScrBuf0        dc.l    0    ;Screen Buffer 0 (Amiga) - Muß zusammen bleiben!
  3309. ScrBuf1        dc.l    0    ;Screen Buffer 1 (Amiga) /
  3310.  
  3311. ComparisonBuf    dc.l    0    ;Puffer für c2p4 - Muß zusammen bleiben!
  3312. ComparisonBuf1    dc.l    0    ;Zweiter Puffer  /
  3313. GfxSet        dc.l    0    ;Signal für c2p4
  3314. GfxSig        dc.w    0
  3315.  
  3316. ScreenType    dc.w    0    ;Prefs: Typ der Screen-Ansteuerung
  3317. NormalCycles    dc.w    0    ;Prefs: Anzahl 6510-Zyklen pro Rasterzeile
  3318. BadLineCycles    dc.w    0    ;Prefs: Anzahl 6510-Zyklen in einer Bad Line
  3319. Collisions    dc.w    0    ;Prefs: Sprite-Kollisionen angeschaltet
  3320. Overscan    dc.w    0    ;Prefs: Overscan-Typ für Amiga-Modi
  3321.  
  3322. CiaVABase    dc.w    0    ;16-Bit Basisadresse durch Cia-VA14/15
  3323. ScreenX        dc.w    0    ;Ausmaße des Screens
  3324. ScreenY        dc.w    0
  3325. MustWaitForC2P    dc.w    0    ;Es muß auf das Signal von c2p gewartet werden
  3326. UsingDB        dc.w    0    ;Flag: Double Buffering wird benutzt
  3327.  
  3328. SkipCounter    dc.w    1
  3329. SkipLatch    dc.w    0    ;Prefs: Nur jedes nte Bild darstellen
  3330.  
  3331.         CNOP    0,4
  3332. Registers    ds.b    VICRegLength    ;VIC-Register
  3333. MatrixLine    ds.b    40    ;Eine Bildschirmzeile
  3334. ColorLine    ds.b    40    ;Eine Farb-RAM-Zeile
  3335.  
  3336. **
  3337. ** Nicht initialisierte Daten
  3338. **
  3339.  
  3340.         SECTION    "BSS",BSS
  3341. LineStore    ds.b    DisplayX    ;Puffer für eine Zeile
  3342. SprCollBuf    ds.b    DisplayX    ;Puffer für Sprite-Sprite-Kollisionen
  3343. GfxCollBuf    ds.b    DisplayX    ;Puffer für Sprite-Grafik-Kollisionen und Priorität
  3344.  
  3345. ModeNameBuf    ds.b    nif_SIZEOF    ;Puffer für GetDisplayInfoData
  3346. TheRect        ds.b    ra_SIZEOF    ;Puffer für QueryOverscan
  3347.         END
  3348.